重新整一遍k8s安装,之前基于centos7.8的,这次采用ubuntu22.04,k8s版本1.23.3。
virtualbox装备
采用ubuntu22.04.1版本 ,虚拟机使用virtulbox
[ubuntu22.04.1镜像下载地址] (http://mirrors.bupt.edu.cn/ubuntu-releases/22.04/)
网卡绑定2张
- 仅主机host-only网络 (让ip固定)
- 网络地址转换(nat) (能够上网)
docker安装
1sudo apt-get install -y docker.io
2sudo service docker start #启动docker服务
3sudo usermod -aG docker ${USER} #当前用户加入docker组
minikube 安装、使用
安装
1curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
2sudo install minikube /usr/local/bin/
3# 安装kubectl ,minikube 简化了这个安装流程,命令如下
4minikube kubectl
5#/home/maozhongyu/.minikube/cache/linux/amd64/v1.24.3/kubectl
启动minikube
1minikube start --kubernetes-version=v1.23.3
2# minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.3
3# 两个命令来查看集群的状态
4minikube status
5minikube node list
6# 登录到这个节点上,虽然它是虚拟的,但用起来和实机也没什么区别
7 minikube ssh
8
9minikube kubectl -- version
vim .bashrc
1alias minikubectl="minikube kubectl --"
2source <(minikubectl completion bash)
1source .bashrc
2minikubectl version --short
result:
1Client Version: v1.23.3
2Server Version: v1.23.3
k8s架构图
master node组件
1apiserver 是 Master 节点——同时也是整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信,可以说是 Kubernetes 里的联络员
2
3etcd 是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,相当于 Kubernetes 里的配置管理员。注意它只与 apiserver 有直接联系,也就是说任何其他组件想要读写 etcd 里的数据都必须经过 apiserver
4
5scheduler 负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得
6
7controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能,相当于监控运维人员。同样地,它也必须通过 apiserver 获得存储在 etcd 里的信息,才能够实现对资源的各种操作
1maozhongyu@maozhongyu-VirtualBox:~$ minikubectl get pod -n kube-system
2NAME READY STATUS RESTARTS AGE
3coredns-64897985d-vf75r 1/1 Running 1 (18m ago) 19m
4etcd-minikube 1/1 Running 1 (18m ago) 19m
5kube-apiserver-minikube 1/1 Running 2 (18m ago) 19m
6kube-controller-manager-minikube 1/1 Running 2 (18m ago) 19m
7kube-proxy-tbm9v 1/1 Running 1 (18m ago) 19m
8kube-scheduler-minikube 1/1 Running 2 (18m ago) 19m
9storage-provisioner 1/1 Running 2 (18m ago) 19m
worker node 组件
1 kubelet、kube-proxy、container-runtime。
2
3kubelet 是 Node 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,相当于是 Node 上的一个“小管家”。
4kube-proxy 的作用有点特别,它是 Node 的网络代理,只负责管理容器的网络通信,简单来说就是为 Pod 转发 TCP/UDP 数据包,相当于是专职的“小邮差”。
5第三个组件 container-runtime 我们就比较熟悉了,它是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期,是真正干活的“苦力”
Kubernetes 的大致工作流程
1每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
2每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
3scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
4controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。
基于vagrant,ubuntu22.04.box 安装1主2从k8s集群
还是用vagrant 解决本机部署集群, 方便,固定ip ,并且可以上网。
vagrant 版本 2.3.0
https://app.vagrantup.com/boxes/search 搜ubuntu22
add vagrant box
1 vagrant box add ubuntu2204 c9ab6adf-af09-4d3d-bc6f-50eda52332f9
2 vagrant box list
1vagrant init
修改vagrantfile
1# -*- mode: ruby -*-
2# vi: set ft=ruby :
3
4Vagrant.configure("2") do |config|
5
6 config.vm.define "k8s-01" do |master|
7 master.vm.box = "ubuntu2204"
8 master.vm.provider "virtualbox" do |vb|
9 vb.memory = 2048
10 vb.cpus = 2
11 end
12 master.vm.network "private_network", ip: "192.168.56.80"
13 master.vm.synced_folder "/Users/mac/code", "/home/www"
14 master.ssh.insert_key = false
15 master.vm.hostname = "master"
16 end
17
18 config.vm.define "k8s-02" do |node1|
19 node1.vm.box = "ubuntu2204"
20 node1.vm.provider "virtualbox" do |vb|
21 vb.memory = 4096
22 vb.cpus = 2
23 end
24 node1.vm.network "private_network", ip: "192.168.56.81"
25 node1.vm.synced_folder "/Users/mac/code", "/home/www"
26 node1.ssh.insert_key = false
27 node1.vm.hostname = "node1"
28 end
29
30 config.vm.define "k8s-03" do |node2|
31 node2.vm.box = "ubuntu2204"
32 node2.vm.provider "virtualbox" do |vb|
33 vb.memory = 2048
34 vb.cpus = 2
35 end
36 node2.vm.network "private_network", ip: "192.168.56.82"
37 node2.vm.synced_folder "/Users/mac/code", "/home/www"
38 node2.ssh.insert_key = false
39 node2.vm.hostname = "node2"
40 end
41
42end
启动、进入虚拟机
1vagrant up
2vagrant ssh k8s-01
3vagrant ssh k8s-02
4vagrant ssh k8s-03
k8s-01,k8s-02,k8s-03 节点,hostname vagrant 已经帮我们设定好了分别叫 master,node1,node2
修改 hosts
不改后续一些命令 会异常 如 kubectl logs pod_name
1192.168.56.80 master
2192.168.56.81 node1
3192.168.56.82 node2
替换阿里云源(所有机器)
/etc/apt/sources.list
1deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
2deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
3deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
4deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
5deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
6deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
7deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
8deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
9deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
10deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
1sudo apt-get update
安装docker ,修改docker配置 ,网络转发 (所有机器)
1sudo apt-get install -y docker.io
2sudo service docker start #启动docker服务
3sudo usermod -aG docker ${USER} #当前用户加入docker组
在“/etc/docker/daemon.json”里把 cgroup 的驱动程序改成 systemd ,然后重启 Docker 的守护进程
1cat <<EOF | sudo tee /etc/docker/daemon.json
2 { "exec-opts": ["native.cgroupdriver=systemd"],
3 "log-driver": "json-file",
4 "log-opts": { "max-size": "100m" },
5 "storage-driver": "overlay2",
6 "registry-mirrors": ["http://hub-mirror.c.163.com"]
7 }
8EOF
9sudo systemctl enable docker
10sudo systemctl daemon-reload
11sudo systemctl restart docker
为了让 Kubernetes 能够检查、转发网络流量,你需要修改 iptables 的配置,启用“br_netfilter”模块:
1cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
2 br_netfilter
3EOF
4
5cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
6 net.bridge.bridge-nf-call-ip6tables = 1
7 net.bridge.bridge-nf-call-iptables = 1
8 net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
9EOF
10
11sudo sysctl --system
你需要修改“/etc/fstab”,关闭 Linux 的 swap 分区,提升 Kubernetes 的性能
1sudo swapoff -a
2sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
安装 kubeadm,kubelet,kubectl (所有机器)
kubeadm 可以直接从 Google 自己的软件仓库下载安装,但国内的网络不稳定,很难下载成功,需要改用其他的软件源,这里我选择了国内的某云厂商
1sudo apt install -y apt-transport-https ca-certificates curl
2
3curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
4
5cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
6deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
7EOF
8
9sudo apt update
用 apt install 获取 kubeadm、kubelet 和 kubectl 这三个安装必备工具(所有机器)
1sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
用 kubeadm version、kubectl version 来验证版本是否正确
1kubeadm version
2kubectl version --client
按照 Kubernetes 官网的要求,我们最好再使用命令 apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误
1sudo apt-mark hold kubeadm kubelet kubectl
下载 Kubernetes 组件镜像 (master节点安装)
使用命令 kubeadm config images list 可以查看安装 Kubernetes 所需的镜像列表,参数 –kubernetes-version 可以指定版本号
1kubeadm config images list --kubernetes-version v1.23.3
2
3k8s.gcr.io/kube-apiserver:v1.23.3
4k8s.gcr.io/kube-controller-manager:v1.23.3
5k8s.gcr.io/kube-scheduler:v1.23.3
6k8s.gcr.io/kube-proxy:v1.23.3
7k8s.gcr.io/pause:3.6
8k8s.gcr.io/etcd:3.5.1-0
9k8s.gcr.io/coredns/coredns:v1.8.6
从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化
1repo=registry.aliyuncs.com/google_containers
2
3for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
4
5 src_name=${name#k8s.gcr.io/}
6 src_name=${src_name#coredns/}
7
8 sudo docker pull $repo/$src_name
9
10 sudo docker tag $repo/$src_name $name
11 sudo docker rmi $repo/$src_name
12done
ps: 另一种办法 利用 minikube。因为 minikube 本身也打包了 Kubernetes 的组件镜像,所以完全可以从它的节点里把这些镜像导出之后再拷贝过来 minikube ssh 登录进虚拟节点,用 docker save -o 命令把相应版本的镜像都保存下来,再用 minikube cp 拷贝到本地。
sudo docker images 查看镜像是否下载完毕,一共7个镜像 可以和 minikube 里的镜像做比对,按理是一致的 ,如果没全,可以多次尝试,有翻墙软件也可以直接下载尝试,下载完这些镜像最好搞成私有仓库镜像,防止后面这云厂商不提供拉取了
1vagrant@master:/etc/docker$ sudo docker images
2REPOSITORY TAG IMAGE ID CREATED SIZE
3k8s.gcr.io/kube-apiserver v1.23.3 f40be0088a83 6 months ago 135MB
4k8s.gcr.io/kube-scheduler v1.23.3 99a3486be4f2 6 months ago 53.5MB
5k8s.gcr.io/kube-controller-manager v1.23.3 b07520cd7ab7 6 months ago 125MB
6k8s.gcr.io/kube-proxy v1.23.3 9b7cc9982109 6 months ago 112MB
7k8s.gcr.io/etcd 3.5.1-0 25f8c7f3da61 9 months ago 293MB
8k8s.gcr.io/coredns/coredns v1.8.6 a4ca41631cc7 10 months ago 46.8MB
9k8s.gcr.io/pause 3.6 6270bb605e12 11 months ago 683kB
安装 Master 节点
kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来, 不过它还有很多参数用来调整集群的配置,你可以用 -h 查看。这里我只说一下我们实验环境用到的 3 个参数: –pod-network-cidr,设置集群里 Pod 的 IP 地址段。 –apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。 对外提供的ip ,我这里就是虚拟机ip 192.168.56.80 –kubernetes-version,指定 Kubernetes 的版本号。
1sudo kubeadm init \
2 --pod-network-cidr=10.10.0.0/16 \
3 --apiserver-advertise-address=192.168.56.80 \
4 --kubernetes-version=v1.23.3
提示如下
1To start using your cluster, you need to run the following as a regular user:
2
3 mkdir -p $HOME/.kube
4 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
5 sudo chown $(id -u):$(id -g) $HOME/.kube/config
6
7Alternatively, if you are the root user, you can run:
8
9 export KUBECONFIG=/etc/kubernetes/admin.conf
10
11You should now deploy a pod network to the cluster.
12Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
13 https://kubernetes.io/docs/concepts/cluster-administration/addons/
14
15Then you can join any number of worker nodes by running the following on each as root:
16
17# 其他节点要加入的命令
18kubeadm join 192.168.56.80:6443 --token zirl4o.ym14t5jq5m1crwzn \
19 --discovery-token-ca-cert-hash sha256:6e847e42fc7ac41c96ba9e9dae8ab2e52f0c9f767d077cbcb7d528e7a49fb3c7
1kubectl get node
2# 这时 status 为 NotReady ,是因为网络还没好
3
4
5sudo kubeadm reset # 重置集群
安装 Flannel 网络插件(作废)
Kubernetes 定义了 CNI 标准,有很多网络插件,这里我选择最常用的 Flannel,可以在它的 GitHub 仓库里(https://github.com/flannel-io/flannel/)找到相关文档。 它安装也很简单,只需要使用项目的“kube-flannel.yml”在 Kubernetes 里部署一下就好了。 不过因为它应用了 Kubernetes 的网段地址,你需要修改文件里的“net-conf.json”字段, 把 Network 改成刚才 kubeadm 的参数 –pod-network-cidr 设置的地址段。
1wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
vim kube-flannel.yml 修改 net-confi.json这里 改成10.10.0.0/16
1 net-conf.json: |
2 {
3 "Network": "10.10.0.0/16",
4 "Backend": {
5 "Type": "vxlan"
6 }
7 }
1kubectl apply -f kube-flannel.yml
稍等一小会,等镜像拉取下来并运行之后,你就可以执行 kubectl get node 来看节点状态:
1vagrant@master:~$ kubectl get node
2NAME STATUS ROLES AGE VERSION
3master Ready control-plane,master 9m42s v1.23.3
这时你应该能够看到 Master 节点的状态是“Ready”,表明节点网络也工作正常了。
安装calico网络插件
1# https://github.com/cr-mao/develop_study/blob/main/k8s_install/calico.yaml
2kubectl apply -f calico.yaml
安装 Worker 节点
拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行
1sudo kubeadm join 192.168.56.80:6443 --token zirl4o.ym14t5jq5m1crwzn \
2 --discovery-token-ca-cert-hash sha256:6e847e42fc7ac41c96ba9e9dae8ab2e52f0c9f767d077cbcb7d528e7a49fb3c7
等会执行, 已经ready了
1vagrant@master:~$ kubectl get nodes
2NAME STATUS ROLES AGE VERSION
3master Ready control-plane,master 22m v1.23.3
4node1 Ready <none> 56s v1.23.3
5node2 Ready <none> 59s v1.23.3
master 节点运行一个pod 来测试
1kubectl run ngx --image=nginx:alpine
1vagrant@master:~$ kubectl get pod -o wide
2NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
3ngx 1/1 Running 0 20s 10.10.2.2 node1 <none> <none>
work节点也能执行kubectl
1mkdir -p $HOME/.kube
2sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
3sudo chown $(id -u):$(id -g) $HOME/.kube/config
将 master 的 ~/.kube/config
拷贝到work节点 ~/.kube/config
1#k8s-01 master节点 , /home/www 是共享目录
2cp ~/.kube/config /home/www
3
4
5#k8s-02,k8s-03 节点运行
6mkdir ~/.kube
7cp /home/www/config ~/.kube/
node1也已经能运行了,同理node2节点
1vagrant@node1:~$ kubectl get pod -o wide
2NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
3ngx 1/1 Running 1 (5m35s ago) 18m 10.10.2.3 node1 <none> <none>
官方 dashboard 部署
-
第一步 kubectl apply -f dashboard-adminuser.yaml ,
dashboard-adminuser.yaml内容如下 ,给权限, 不然进去 提示没各种权限
1---
2apiVersion: v1
3kind: Namespace
4metadata:
5 name: kubernetes-dashboard
6---
7apiVersion: v1
8kind: ServiceAccount
9metadata:
10 name: admin-user
11 namespace: kubernetes-dashboard
12---
13apiVersion: rbac.authorization.k8s.io/v1
14kind: ClusterRoleBinding
15metadata:
16 name: admin-user
17roleRef:
18 apiGroup: rbac.authorization.k8s.io
19 kind: ClusterRole
20 name: cluster-admin
21subjects:
22- kind: ServiceAccount
23 name: admin-user
24 namespace: kubernetes-dashboard
- 第二步
https://github.com/kubernetes/dashboard
需要在下载来的文件中改这个
type: NodePort
(我改好的文件recommended.yaml)
1kubectl get service -A
2
3kubernetes-dashboard kubernetes-dashboard NodePort 10.105.167.219 <none> 443:31659/TCP 9m13s
4
5主机ip:31659 即可
6用firefox浏览器打开
1#访问测试
2每次访问都需要令牌
3kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
kuboard 第三方集群管理界面部署
1kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
2
3# kubectl apply -f kuboard-v3.yaml
安装过程中 ubuntu镜像拉取不下来问题解决
幸运的是我mac 可以 拉下来
1# 镜像导出文件
2docker save eipwork/kuboard-agent:v3 > kuboard-agentv3.tar
3# 镜像倒入
4sudo docker load < kuboard-agentv3.tar
http://192.168.56.80:30080/
账号密码 admin Kuboard123