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'
network:
ethernets:
ens33: []
dhcp4: false[]
addresses: [192.168.71.150/24]
gateway4: 192.168.71.2
nameservers:
addresses: [192.168.71.2,8.8.8.8]
version: 2

 4. 设置设置root密码和ssh权限

步骤一 设置root密码 sudo passwd root
步骤二 设置root可以ssh访问

sudo vi /etc/ssh/sshd_config
1.把PermitRootLogin Prohibit-password 添加#注释掉
2.新添加:PermitRootLogin yes
3.重启ssh服务 sudo /etc/init.d/ssh restart

说明:本文以后都是以root身份登录

二、安装kubernetes

在机器上安装kubernetes软件,注意下面说明

  1. 因为kubernetes安装容易出错,所以先做此操作,所有的node节点上都安装kubernetes
  2. 注意:执行此操作之前apt镜像不要设置阿里源,否则会导致iptables安装的版本过高导致kubeadm等安装失败
  3. 所谓的kubernetes软件的安装指的是apt-get install kubelet kubeadm kubectl,在master和slave上都要执行
  4. kubeadm是一个命令工具用来创建管理kubernetes的安装和启动,kubernetes启动成功了之后kubeadm就没有用了,在master和slave上都用
  5. kubectl是一个命令行工具,用来管理kubernetes的pods等如创建和删除,好像只在master上用
  6. kubelet是一个服务,可以用systemctl来管理,可以认为是kubernetes在每个node上启动的服务,master和slave都要用
  7. 上面说的三个软件在master和slave的node上都需要安装
  8. 这一步安装完了,其他安装的问题就比较少了

 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
三、Ubuntu Server设置

 kubernetes安装完了之后,要通过kubeadm启动他,在这之前要设置ubuntu server的配置环境,让kubernetes运行起来,配置环境主要设置三个:

  1. 关闭交换区:关闭文件作为内存交换区
  2. ip转发:出于安全考虑,Linux系统默认是禁止数据包转发的
  3. 设置ubuntu server 的DNS
  4. 设置所有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

四、安装docker及pull images

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

 说明:

  1. 执行images.sh的时候会报错,你先执行dpkg-reconfigure dash,在弹出的对话框中选择“No”然后再执行kubernetes.sh即可
  2. 不同的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.
五、master启动kubernetes

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启动kubernetes

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>

 

posted on 2021-10-16 16:16  Netsharp  阅读(292)  评论(0编辑  收藏  举报

导航