ubuntu server 20.4.3下部署kubernetes集群
本文介绍我使用三台物理机在ubuntu server 20.4.3上部署kubernetes,因为ubuntu server 20.4.3有自动发现wifi的能力,ubuntu server 20.4.3下有一些需要注意的事项,本文会把遇到的问题都强调出来,debain也可以参考此方案(根据我的经验,在虚拟机上使用debian10.9.0上部署kubernetes集群非常流畅)。
1. 准备三台物理机器
他们的参数如下:
编号 | 主机名 | IP | 用途 | 配置 |
01 | kbsm | 192.168.0.105 | 作为master | 12逻辑核,16G内存 |
02 | kbs1 | 192.168.0.106 | 作为slave 1 | 8逻辑核,16G内存 |
03 | kbs2 | 192.168.0.107 | 作为slave 2 | 2逻辑核,4G内存 |
2. ubuntu server 20.4.3安装准备
- 下载ubuntu server 20.4.3的iso,并做好U盘启动盘
- WIFI环境,准备好用户名和密码
3. 安装ubuntu server 20.4.3
在三台机器上安装ubuntu server 20.4.3系统,注意事项
- 设置WIFI接入网络
- 自动安装SshServer,不安装其他的server
- 安装最后不要安装自动更新
我的机器是家庭环境的WIFI自动获取IP,如果是虚拟机或者静态IP需要进行IP的设置,具体方式是:vi /etc/netplan/00-installer-config.yaml,然后编辑形如下面的内容:
# This is the network config written by 'subiquity' |
4. 设置设置root密码和ssh权限
步骤一 | 设置root密码 | sudo passwd root |
步骤二 | 设置root可以ssh访问 |
sudo vi /etc/ssh/sshd_config |
说明:本文以后都是以root身份登录
在机器上安装kubernetes软件,注意下面说明
- 因为kubernetes安装容易出错,所以先做此操作,所有的node节点上都安装kubernetes
- 注意:执行此操作之前apt镜像不要设置阿里源,否则会导致iptables安装的版本过高导致kubeadm等安装失败
- 所谓的kubernetes软件的安装指的是apt-get install kubelet kubeadm kubectl,在master和slave上都要执行
- kubeadm是一个命令工具用来创建管理kubernetes的安装和启动,kubernetes启动成功了之后kubeadm就没有用了,在master和slave上都用
- kubectl是一个命令行工具,用来管理kubernetes的pods等如创建和删除,好像只在master上用
- kubelet是一个服务,可以用systemctl来管理,可以认为是kubernetes在每个node上启动的服务,master和slave都要用
- 上面说的三个软件在master和slave的node上都需要安装
- 这一步安装完了,其他安装的问题就比较少了
vi kubernetes.sh添加如下代码,并执行:ssh kubernetes.sh
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl
kubernetes安装完了之后,要通过kubeadm启动他,在这之前要设置ubuntu server的配置环境,让kubernetes运行起来,配置环境主要设置三个:
- 关闭交换区:关闭文件作为内存交换区
- ip转发:出于安全考虑,Linux系统默认是禁止数据包转发的
- 设置ubuntu server 的DNS
- 设置所有node之间ssh免密访问
1. 关闭交换区
- vi /etc/fstab
- 注释掉有swap的那一行,在ubuntu server 20.4.3下是最后一行
- swapoff -a
2. 设置IP转发ubuntu server 20.4.3
- vi /etc/sysctl.conf
- 找到net.ipv4.ip_forward=1这一行,取消注释
- 运行sysctl -p后出现net.ipv4.ip_forward = 1则正常
设置ssh免密访问(所有的机器都要设置)
生成秘钥(所有master和slave的node都要生成):
- ssh-keygen -t rsa # 出现输入地方不用输入直接enter
3.设置ubuntu server的DNS
默认情况下,你执行ping www.baidu.com是不通的,所以不能访问外网,以后的docker pull image以及下载yaml文件都会失败,因为默认使用的是本地DNS,需要进行设置
echo -e "DNS=8.8.8.8 114.114.114.114" >> /etc/systemd/resolved.conf systemctl restart systemd-resolved
4. 设置node间ssh免密访问
1) 每个node执行:vi /etc/hosts,然后编辑
192.168.0.105 kbsm 192.168.0.106 kbs1 192.168.0.107 kbs2 |
2) 每个机器都要设置到另外两台node的ssh-copy-id,自己就不用了,下面写出了命令的全集
ssh-copy-id root@kbsm ssh-copy-id root@kbs1 ssh-copy-id root@kbs2 |
3) ssh-copy-id是否成功通过如下命令来检测,如果不输入密码就可以ssh成功就可以了
ssh root@kbsm ssh root@kbs1 ssh root@kbs2 |
1. 安装docker
vi docker.sh然后录入如下脚本,然后执行sh docker.sh
# 1. 安装/升级Docker客户端 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 2. 配置镜像加速器 mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://wn8y8b1w.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
2. 加载kubernetes镜像
因为kubernetes在启动的时候,kubernetes的proxy这些组件也是docker容器,如果使用kubeadm init的话,会到官方的镜像库加载image而失败,但是我们可以提前进行下载,这样kubeadm init的时候就不会再下载了
vi images.sh然后输入如下脚本,然后执行sh images.sh
#!/bin/bash # https://my.oschina.net/u/1248740/blog/3138132 # 执行报错参见:https://blog.csdn.net/Panda_813/article/details/88634181 # 既执行:dpkg-reconfigure dash 弹框选择No # kubeadm config images list 查看当前容器版本 images=("kube-apiserver:v1.22.2" "kube-controller-manager:v1.22.2" "kube-scheduler:v1.22.2" "kube-proxy:v1.22.2" "pause:3.5" "etcd:3.5.0-0") for imageName in ${images[@]} do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} k8s.gcr.io/${imageName} docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/${imageName} done # coredns/coredns:1.8.0使用DockerHub上的源,我用阿里云的的会有问题 docker pull coredns/coredns:1.8.4 docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4 docker rmi coredns/coredns:1.8.4
说明:
- 执行images.sh的时候会报错,你先执行dpkg-reconfigure dash,在弹出的对话框中选择“No”然后再执行kubernetes.sh即可
- 不同的kubernetes对应的image的版本不一样,参见下面的脚本,我用的是v1.22.2和1.8.4,版本不一样需要修改这些版本号
3. 设置kubernetes和docker的cgoups一致
vi /etc/docker/daemon.json打开后,添加红色行,上一行别忘记加逗号
vi /etc/docker/daemon.json { "registry-mirrors": ["https://wn8y8b1w.mirror.aliyuncs.com"], "exec-opts":["native.cgroupdriver=systemd"] } |
说明:如果不cgroups不一致,在kubeadm init的时候会出现这个错误
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.
1. master上执行kubeadm init
这一步如果成功,kubernetes的安装基本就没有障碍了,在master上执行
kubeadm init --pod-network-cidr=192.168.0.0/16
如果出现问题也不要害怕,执行kubeadm reset之后就可以重新kubeadm init
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
2. master上安装网络:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
3. token及hash管理
token在slave join到slave的时候会使用,但是kubeadm init生成的token有效期只有一天,可以自己通过命令来重新生成一个永不过期的token
kubeadm token create --ttl 0 --print-join-command
--print-join-command 选项的意思是自动生成kubeadm join语句,这样salve在join的时候直接使用,如:
kubeadm join 192.168.0.105:6443 --token 6btowg.ybc1qw412yvjeq4e --discovery-token-ca-cert-hash sha256:61a5ac64ceea78dbb20c4bb6b71a8f16d9144c20760853989d8386c1e8619a8b
如果已经创建,可以通过如下两个命令分别得到token与hash值
# 查看token kubeadm token list # 查看hash openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
slave上执行kubeadm join
kubeadm join 192.168.0.105:6443 --token 6btowg.ybc1qw412yvjeq4e --discovery-token-ca-cert-hash sha256:61a5ac64ceea78dbb20c4bb6b71a8f16d9144c20760853989d8386c1e8619a8b
1.在master上看节点的情况
所有状态都是Ready是正常的,如果不是有时候是因为慢,要等一下
kubectl get nodes NAME STATUS ROLES AGE VERSION kbs1 Ready <none> 6h37m v1.22.2 kbs2 Ready <none> 10h v1.22.2 kbsm Ready control-plane,master 4d22h v1.22.2
2. 在master上查看kubernetes自己安装的pod
所有状态都是Running是正常的,如果不是有时候是因为慢,要等一下
kubectl get pods --all-namespaces -o wide NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system calico-kube-controllers-75f8f6cc59-nrz6g 1/1 Running 1 (10h ago) 4d21h 192.168.205.6 kbsm <none> <none> kube-system calico-node-jwkvd 1/1 Running 1 (6h47m ago) 6h53m 192.168.0.106 kbs1 <none> <none> kube-system calico-node-svx9b 1/1 Running 4 (6h5m ago) 10h 192.168.0.107 kbs2 <none> <none> kube-system calico-node-t6qrw 1/1 Running 1 (10h ago) 4d21h 192.168.0.105 kbsm <none> <none> kube-system coredns-78fcd69978-c24p2 1/1 Running 1 (10h ago) 4d22h 192.168.205.5 kbsm <none> <none> kube-system coredns-78fcd69978-w5qhm 1/1 Running 1 (10h ago) 4d22h 192.168.205.4 kbsm <none> <none> kube-system etcd-kbsm 1/1 Running 3 (10h ago) 4d22h 192.168.0.105 kbsm <none> <none> kube-system kube-apiserver-kbsm 1/1 Running 3 (10h ago) 4d22h 192.168.0.105 kbsm <none> <none> kube-system kube-controller-manager-kbsm 1/1 Running 2 (10h ago) 4d22h 192.168.0.105 kbsm <none> <none> kube-system kube-proxy-6dfgj 1/1 Running 4 (6h5m ago) 10h 192.168.0.107 kbs2 <none> <none> kube-system kube-proxy-bpmss 1/1 Running 1 (10h ago) 4d22h 192.168.0.105 kbsm <none> <none> kube-system kube-proxy-gmmnw 1/1 Running 1 (6h47m ago) 6h53m 192.168.0.106 kbs1 <none> <none> kube-system kube-scheduler-kbsm 1/1 Running 5 (10h ago) 4d22h 192.168.0.105 kbsm <none> <none>
作者 :秋时
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。