基于kubeadm 部署K8S1.22.3 踩坑
服务器节点:k8s-master01192.168.1.50k8s-node01192.168.1.51k8s-node02192.168.1.52一、安装docker,所有服务器都需要安装安装Docker的依赖库。yum install -y yum-utils device-mapper-persistent-data lvm2添加阿里云Docker CE的软件源信息。yum-config-m
服务器节点:
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"]
}
daemon.json其他参考配置
{
// 注册镜像-加速镜像站配置
"registry-mirrors": [
"https://XXX.mirror.aliyuncs.com"
],
// 存储位置更改
"graph": "/disk/docker",
// 容器日志分割
"log-driver":"json-file",
"log-opts": {
"max-size":"500m",
"max-file":"3",
"labels": "production_status",
"env": "os,customer"
},
// 限定容器使用磁盘的大小
"data-root": "/data/docker",
// 存储驱动采用 overlay2
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=1G"
],
// 把docker更改驱动为systemtd
"exec-opts": ["native.cgroupdriver=systemd"],
// 镜像仓库的 IP 地址或者域名(harbor或者docker)
"insecure-registries" : ["https://XXX.com.cn"]
}
重启docker服务
systemctl daemon-reload
systemctl restart docker
docker注册仓库报https错误在/usr/lib/systemd/system/docker.service的启动参数containerd.sock 后添加添加
--insecure-registry=http://192.168.1.27 #仓库地址
在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
后期扩容新增node节点操作:
Node节点加入集群操作方法
kubeadm join 192.168.1.50:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】
查看token(master端操作)
kubeadm token list
master中的节点认证信息24小时会失效,可以重新生成token
kubeadm token create
创建新的sha
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der sha256 -hex | sed 's/^.* //'
在新的node节点上执行
kubeadm join 192.168.1.50:6443 --token r44gqq.5t9gtrgx4u8rjq9u --discovery-token-ca-cert-hash sha256:7b927f3138d3113ab86ce466afc41ce70410dbeb895a621868b444f2d7c1b80b
如何删除节点(master端)
[root@master ~]# kubectl drain k8s-node01 --delete-local-data --force --ignore-daemonsets
[root@master ~]# kubectl delete node k8s-node01
更多推荐
所有评论(0)