最近用k8s搭建自己的云工作环境,便在腾讯云购买两台服务器来部署,以下是k8s集群部署过程,欢迎大家参考。

环境说明

云服务器:腾讯云
操作系统:centos 7.8
kubeadm k8s 版本:v1.22.4
docker版本: 20.10.11
云服务器:172.17.0.17 hjforever-master (单节点) 172.17.0.15 hjforever-node1 (工作节点)

系统环境准备

每个节点的环境准备都需要执行

修改云服务器节点的host及hostname

1
2
3
4
5
hostnamectl set-hostname hjforever-master
hostnamectl set-hostname hjforever-node1
vi /etc/hosts
172.17.0.15 hjforever-node1
172.17.0.17 hjforever-master

关闭防火墙 firewalld 和 selinux

1
2
3
4
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

云服务器内网端口访问也会被安全组限制,在腾讯安全组中需要加上子网中端口访问权限具体配置规则如下。

关闭swap

1
2
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

系统参数配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cat > /etc/sysctl.d/k8s_better.conf << EOF
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
EOF
sysctl -p /etc/sysctl.d/k8s_better.conf
sysctl -w net.bridge.bridge-nf-call-iptables=1

确保每一台集齐uuid不一致

1
cat /sys/class/dmi/id/product_uuid

安装基础组件

1
2
3
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

安装docker及k8s

每个节点的环境准备都需要执行

设置阿里云 docker yum 源镜像

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

安装docker

安装

1
2
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce docker-ce-cli containerd.io

vim /etc/docker/daemon.json 添加docker配置文件,当文件不存在则自己添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim /etc/docker/daemon.json
{
"exec-opts": [
"native.cgroupdriver=systemd"
],
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "1000m",
"max-file": "3"
},
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries": [],
"selinux-enabled": false
}

启动docker

1
2
systemctl enable docker
systemctl start docker

验证docker

1
2
docker run hello-world
docker version

设置阿里云 k8s yum源镜像

1
2
3
4
5
6
7
8
9
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

1
2
yum install -y kubectl-1.22.4 kubelet-1.22.4 kubeadm-1.22.4
systemctl enable kubelet

初始化部署Master节点及工作节点

初始化master节点 (master节点上执行此处为172.17.0.17 )

1
2
3
4
5
6
7
kubeadm init \
--apiserver-advertise-address=172.17.0.17 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all

–apiserver-advertise-address 集群通告地址(master集群地址,此处为单master节点)
–image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
–kubernetes-version K8s版本,与上面安装的一致
–service-cidr 集群内部虚拟网络,Pod统一访问入口
–pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致
–ignore-preflight-errors=all 忽略一些检查错误

初始化后根据提示执行以下命令,后续kubectl默认控制集群时,需要使用到CA密钥,通过TLS协议保障通讯的安全性。我们要通过下面3行命令拷贝密钥信息,这样,kubectl执行时会首先访问当前用户的.kube目录,使用这些授权信息访问集群。

1
2
3
4
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

之后添加worker节点时,要通过token才能保障安全性,此处先手动保存此命令

1
kubeadm join 172.17.0.17:6443 --token lgcp23.pxw8hzdi0n0nmwfk --discovery-token-ca-cert-hash sha256:2bd3c21974df4a996e532c97a96146b7e420e7043236db452a6ceedf40768f0b

部署flannel网络

flannel网络需要指定IP地址段,在上一步中已经通过编排文件设置为10.244.0.0/16。部署flannel只需要一行命令:

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

此时,调用get pods命令,可以看到master节点的组件和flannel网络都牌Running状态:

部署工作节点 (此处为172.17.0.15)

在工作节点上执行之前保存的的kubeadm join命令,建议加上 --v=5来看下前置校验,如果不通过可以根据提示处理

1
kubeadm join 172.17.0.17:6443 --token lgcp23.pxw8hzdi0n0nmwfk --discovery-token-ca-cert-hash sha256:2bd3c21974df4a996e532c97a96146b7e420e7043236db452a6ceedf40768f0b

在master节点通过kubectl get nodes命令可以看到集群中已有2个节点:

处理 kubectl get cs 报错

执行 kubectl get cs 如果出现Get “https://127.0.0.1:10257/healthz”: dial tcp 127.0.0.1:10257: connect: connection refused 报错,则执行以下操作 , 打开以下两个配置文件分别 注释 - --port=0这一行,参考下图

1
2
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml

修改之后保存即可,配置修改后组件会检测自动重启。再次执行 kubectl get cs 不报错即可。