基于kubeadm 部署K8S1.22.3 踩坑

服务器节点:

k8s-master01 192.168.1.50
k8s-node01 192.168.1.51
k8s-node02 192.168.1.52

一、安装docker,所有服务器都需要安装

安装Docker的依赖库。

yum install -y yum-utils device-mapper-persistent-data lvm2

添加阿里云Docker CE的软件源信息。

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker CE。

yum makecache fast yum -y install docker-ce

启动Docker服务。

systemctl start docker

 设置开机自动启动

systemctl enable docker

二、使用kubeadm引导部署k8s

参考链接:使用 kubeadm 引导集群 | Kubernetes

服务器初始配置(所有服务器同样操作)

#关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

#设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

#在master添加hosts
cat >> /etc/hosts << EOF
192.168.1.50 k8s-master01
192.168.1.51 k8s-node01
192.168.1.52 k8s-node02
EOF

#启用IPv4模块
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

配置国内阿里云k8s源
# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装 kubeadm、kubelet 和 kubectl

你需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。

  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

  • kubectl:用来与集群通信的命令行工具。

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

由于 kubeadm 把 kubelet 视为一个系统服务来管理,所以对基于 kubeadm 的安装, 官方推荐使用 systemd 驱动,不推荐 cgroupfs 驱动,因此需要修改kubelet或者docker的 cgroup driver,否则会因两者cgroup driver不一致出现以下错误:

Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""

官方参考链接:配置 cgroup 驱动 | Kubernetes

方法1、修改docker的Cgroup Driver
修改/etc/docker/daemon.json文件,没有就创建一个

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker服务

systemctl daemon-reload
systemctl restart docker

在master节点使用kubeadm进行初始化

由于默认拉取镜像地址k8s.gcr.io国内无法访问,修改指定阿里云镜像仓库地址

kubeadm init --apiserver-advertise-address=192.168.1.50 \
 --apiserver-bind-port=6443 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository registry.aliyuncs.com/google_containers

初始化完成后,会显示添加节点命令

Your Kubernetes control-plane has initialized successfully!
​
To start using your cluster, you need to run the following as a regular user:
​
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
​
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
​
Then you can join any number of worker nodes by running the following on each as root:
​
kubeadm join 192.168.1.50:6443 --token 93erio.hbn2ti6z50he0lqs \
    --discovery-token-ca-cert-hash sha256:3bc60f06a19bd09f38f3e05e5cff4299011b7110ca3281796668f4edb29a56d9  #需要记住
​

master节点上执行

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

在node01和node02分别执行

kubeadm join 192.168.90.110:6443 --token 0o6bsj.upbk5c0v6vlytltk \
    --discovery-token-ca-cert-hash sha256:7be9e4de61b64a38b4a3579b6f5eefbcd7b32c703a788a8d4d2ffc73a3bc53c

如出现节点无法添加并报以下错误时

error execution phase preflight: couldn't validate the identity of the API Server: invalid discovery token CA certificate hash: invalid hash "sha256:7be9e4de61b64a38b4a3579b6f5eefbcd7b32c703a788a8d4d2ffc73a3bc53c", expected a 32 byte SHA-256 hash, found 31 bytes

1、kubernetse-master重新生成token:
#kubeadm token create   
1p40ao.o433wcrxg6lnaa05

2、查看值
#openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
8be9e4de61b64a38b4a3579b6f5eefbcd7b32c703a788a8d4d2ffc73a3bc53c8

3、在node节点中执行此命令 join就成功了
#kubeadm join 192.168.1.50:6443 –token 1p40ao.o433wcrxg6lnaa05 \ --discovery-token-ca-cert-hash sha256:8be9e4de61b64a38b4a3579b6f5eefbcd7b32c703a788a8d4d2ffc73a3bc53c8

添加完成后,查看节点状态是NotReady,这是因为网络节点还未安装。

[root@master01 manifests]# kubectl get nodes
NAME       STATUS     ROLES                  AGE    VERSION
master01   NotReady   control-plane,master   162m   v1.22.3
node01     NotReady   <none>                 63m    v1.22.3
node02     NotReady   <none>                 63m    v1.22.3

检查组件状态:

[root@master01 ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}   
controller-manager   Healthy   ok   

检测状态时由于/etc/kubernetes/manifests/下的kube-controller-manager.yaml和kube-scheduler.yaml设置的默认端口是0,因此可能导致以下错误:

Unhealthy  Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused 

解决方式是注释掉对应的port即可,进入/etc/kubernetes/manifests/目录进行一下操作:

kube-controller-manager.yaml文件修改:注释掉27行 #- --port=0

kube-scheduler.yaml配置修改:注释掉19行 #- --port=0

查看各节点状态:

由于当前未安装网络组件,各节点状态是notready

[root@master01 ~]# kubectl get nodes
NAME       STATUS     ROLES                  AGE   VERSION
master01   NotReady   control-plane,master   23h   v1.22.3
node01     NotReady   <none>                 22h   v1.22.3
node02     NotReady   <none>                 22h   v1.22.3

下面进行网络组件配置参考链接:添加 Windows 节点 | Kubernetes

首先下载并配置 Linux 版本的 Flannel,下载最新的 Flannel 清单文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

部署pod

kubectl apply -f kube-system.yml

查看pod是否都正常运行

kubectl get pods -n kube-system

如果pod状态存在异常,

使用kubectl logs 当前异常pod命 -n kube-system 进行日志查看

完成k8s部署后,部署kuboard界面化管理工具

kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml

参考链接:在 K8S 中安装 Kuboard v3 | Kuboard

上一篇:kubectl 创建 Pod 背后到底发生了什么?


下一篇:mybatis 动态Sql