所有主机按k8s官方最低要求2C4G ,操作前参考上一篇docker环境安装配置先把docker环境搭好。
| 主机名 | 主机ip | 节点角色 |
|---|---|---|
| k8s-master | 192.168.31.20 | master |
| k8s-node1 | 192.168.31.30 | node |
| k8s-node2 | 192.168.31.40 | node |
一、所有节点主机操作
- 修改主机名(分别对应节点主机选择操作)
# 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
- 添加并执行初始化脚本
#!/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节点主机操作
- 初始化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
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
- 配置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
- 获取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节点主机操作
- 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
注:过一会node节点会自动变成Ready
- 任意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节点操作)
-
启动nginx
kubectl create deployment --image nginx:1.20.2 --replicas=2 nginx -
暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort -
查看pod以及服务信息
kubectl get pod,svc -o wide
- 宿主机访问所有节点的nginx暴露端口。
http://192.168.31.20:32551/
http://192.168.31.30:32551/
http://192.168.31.40:32551/
至此k8s集群部署完毕。