Kubernetes 1.28版本,一主二从集群部署

411 阅读5分钟

所有主机按k8s官方最低要求2C4G操作前参考上一篇docker环境安装配置先把docker环境搭好。

主机名主机ip节点角色
k8s-master192.168.31.20master
k8s-node1192.168.31.30node
k8s-node2192.168.31.40node

一、所有节点主机操作

  1. 修改主机名(分别对应节点主机选择操作)
# k8s-master
# 临时修改主机名
hostnamectl set-hostname k8s-master
# 永久修改主机名
echo "k8s-master" | sudo tee /etc/hostname

# k8s-node1
# 临时修改主机名
hostnamectl set-hostname k8s-node1
# 永久修改主机名
echo "k8s-node1" | sudo tee /etc/hostname

# k8s-node2
# 临时修改主机名
hostnamectl set-hostname k8s-node2
# 永久修改主机名
echo "k8s-node2" | sudo tee /etc/hostname

2. 配置hosts

cat >> /etc/hosts << EOF
192.168.31.20 k8s-master
192.168.31.30 k8s-node1
192.168.31.40 k8s-node2
EOF

  1. 添加并执行初始化脚本
#!/bin/bash
echo " 关闭防火墙与SELinux..."
sleep 3
systemctl disable firewalld --now &> /dev/null
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

echo "设置时区并同步时间..."
sleep 3
timedatectl set-timezone Asia/Shanghai
yum install -y chrony &> /dev/null
systemctl enable chronyd --now &> /dev/null
sed -i '/^server/s/^/# /' /etc/chrony.conf
sed -i '/^# server 3.centos.pool.ntp.org iburst/a\server ntp1.aliyun.com iburst\nserver ntp2.aliyun.com iburst\nserver ntp3.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd &> /dev/null
chronyc sources &> /dev/null

echo "设置系统最大打开文件数..."
sleep 3
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535   # 软限制
* hard nofile 65535   # 硬限制
EOF
fi

echo "系统内核优化..."
sleep 3
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1             # 防范SYN洪水攻击,0为关闭
net.ipv4.tcp_max_tw_buckets = 20480     # 此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死
net.ipv4.tcp_max_syn_backlog = 20480    # 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数
net.core.netdev_max_backlog = 262144    # 每个网络接口 接受数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目
net.ipv4.tcp_fin_timeout = 20           # FIN-WAIT-2状态的超时时间,避免内核崩溃
EOF

echo "减少SWAP使用..."
sleep 3
echo "0" > /proc/sys/vm/swappiness

echo "关闭SWAP..." 
sleep 3
swapoff -a # 临时关闭 
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭 

echo "安装系统性能分析工具及其他..."
sleep 3
yum install -y vim net-tools lsof wget lrzsz &> /dev/null

echo "success..."

4. 开启bridge网桥过滤

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 由于开启bridge功能,需要加载br_netfilter模块来允许在bridge设备上的数据包经过iptables防火墙处理
modprobe br_netfilter && lsmod | grep br_netfilter

# 加载配置文件
sysctl -p /etc/sysctl.d/k8s.conf

5. 配置docker的Cgroup驱动为systemd,为了保持与k8s的一致

vi /etc/docker/daemon.json

# 加入以下内容
"exec-opts": ["native.cgroupdriver=systemd"]

# 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker

6. 安装cri-dockerd(从 Kubernetes 1.24 版本开始,Kubernetes 不再默认支持 Docker 作为容器运行时)

# 下载安装包(下载很慢建议宿主机科学下载)
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2-3.el7.x86_64.rpm
# 安装
rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm

# 编辑cri-docker.service文件,修改以下内容
vim /usr/lib/systemd/system/cri-docker.service 
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

# 重启cri-dockerd服务
systemctl daemon-reload
systemctl restart cri-docker.service
# 开机自启动
systemctl enable cri-docker.service

7. 添加阿里k8s源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

8.安装k8s客户端

# kubeadm:用于初始化集群,并配置集群所需的组件并生成对应的安全证书和令牌;
# kubelet:负责与 Master 节点通信,并根据 Master 节点的调度决策来创建、更新和删除 Pod,同时维护 Node 节点上的容器状态;
# kubectl:用于管理k8集群的一个命令行工具;

yum install -y kubeadm-1.28.0 kubelet-1.28.0 kubectl-1.28.0

# 设置kubelet开机自启(不需要直接开启,初始化过程会启动kubelet)
systemctl enable kubelet

二、master节点主机操作

  1. 初始化k8s集群
# 只需要修改advertise-address=192.168.31.20 为master主机IP
kubeadm init \
  --apiserver-advertise-address=192.168.31.20 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --cri-socket=unix:///var/run/cri-dockerd.sock
  
# 初始化失败使用以下命令重置
kubeadm reset --cri-socket /var/run/cri-dockerd.sock
  

image.png

2.配置认证文件,用于node节点加入集群,或后期集成CICD用到

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

  1. 配置Calico网络组件
# 下载配置文件
wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
wget https://docs.projectcalico.org/manifests/custom-resources.yaml

# 修改配置文件
vim custom-resources.yaml

# This section includes base Calico installation configuration.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # Configures Calico networking.
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16		### 修改为初始化集群时--pod-network-cidr地址,一般约定这个
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()

---

# This section configures the Calico API server.
# For more information, see: https://projectcalico.docs.tigera.io/master/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer 
metadata: 
  name: default 
spec: {}

4. 部署Calico网络插件

# 当一个新节点加入集群时,Calico DaemonSet 会自动在该节点上启动所需的 Calico 组件,node节点无需手动再次安装
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml 

# 此时查看节点状态显示NotReady---过一会会"Ready"
kubectl get nodes

image.png

  1. 获取node节点加入需要的凭证
# 哈希值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | \
awk '{print $2}'

# token
kubeadm token list

三、node节点主机操作

  1. node节点加入集群
# ip为master节点IP,token与sha256为master节点生成
kubeadm join 192.168.31.20:6443 --token 2kxoyf.cx1sjq14jlrs9kd4 \
	--discovery-token-ca-cert-hash sha256:17e3cb9df1ffceae20644b21278b2413cd5cb4a50f4aeaf8e5bb081b7871f07c \
	--cri-socket=unix:///var/run/cri-dockerd.sock

image.png

注:过一会node节点会自动变成Ready

  1. 任意node节点使用kubectl(可选,一般在master节点操作的)
# 将master节点中/etc/kubernetes/admin.conf 拷贝到node节点 /etc/kubernetes 目录中
scp /etc/kubernetes/admin.conf root@k8s-node1:/etc/kubemetes

# 配置认证文件
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

四、测试(在master节点操作)

  1. 启动nginx kubectl create deployment --image nginx:1.20.2 --replicas=2 nginx image.png

  2. 暴露端口kubectl expose deployment nginx --port=80 --type=NodePort

  3. 查看pod以及服务信息 kubectl get pod,svc -o wide

image.png

  1. 宿主机访问所有节点的nginx暴露端口。

http://192.168.31.20:32551/

http://192.168.31.30:32551/

http://192.168.31.40:32551/

image.png

至此k8s集群部署完毕。

参考于此文档