K8S手动部署

集群环境 (1.18.10/1.22.16)

内网地址 类型 操作系统 服务器配置
10.0.0.7 Master CentOS 7.6 2C8G
10.0.0.5 Node CentOS 7.6 2C8G
10.0.0.6 Node CentOS 7.6 2C8G

初始化配置

  • 关闭防火墙,禁用iptables,关闭selinux ,禁用swap分区(云服务器默认)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#关闭firewalld服务
systemctl stop firewalld
#禁止firewalld服务开机启动
systemctl disable firewalld

#关闭iptables服务
systemctl stop iptables
#禁止iptables服务开机启动
systemctl disable iptables

sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时

swapoff -a # 临时
sed -ri 's/.swap./#&/' /etc/fstab # 永久
free -m # 查看
  • (修改主机名)配置部署节点的/etc/hosts, 添加节点的ip和主机名解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 各自执行,修改主机名
hostnamectl set-hostname k8s-master-01
hostnamectl set-hostname k8s-node-01
hostnamectl set-hostname k8s-node-02

# 写入hosts解析(三台机器都执行)
echo '''
10.0.0.7 k8s-master-01
10.0.0.5 k8s-node-01
10.0.0.6 k8s-node-02
''' >> /etc/hosts

# 检查hosts
cat /etc/hosts
  • 添加网桥过滤和地址转发功能

在 Kubernetes 集群中,每个 Pod 都会被分配一个 IP 地址,Pod 内的容器也会被分配一个虚拟网卡和 IP 地址。当两个 Pod 之间需要通信时,它们使用这些 IP 地址进行通信。
然而,当 Pod 内的容器尝试与另一个 Pod 进行通信时,它们不会使用其 IP 地址直接发送数据包,而是会使用桥接的方式进行通信。这意味着数据包将通过 Linux 内核中的桥接设备进行传输,而不是通过网络接口发送。

为了确保这些桥接的数据包能够被正确地路由和转发,需要将它们传递到 iptables 的链中进行处理。Iptables 可以用于定义网络规则,使数据包能够正确路由到目的地。通过将桥接的 IPv4 流量传递到 iptables 的链中,可以确保 Kubernetes 集群中的 Pod 能够正确地通信,并且可以实现一些高级的网络功能,如网络策略和负载均衡等。

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

sysctl -p
  • 加载网桥过滤模块
1
2
3
modprobe br_netfilter
# 查看是否加载成功
lsmod | grep br_netfilter

  • 配置ipvs功能

在K8S中service有两种代理模型,一种基于iptables,一种基于ipvs。ipvs性能明显高一些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装ipset和ipvsadm
yum install ipset ipvsadmin
# 如果提示No package ipvsadmin available.需要使用
yum install ipvsadm

# 添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
1
2
3
4
5
6
# 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 执行脚本文件
bash /etc/sysconfig/modules/ipvs.modules
# 查看对应模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

  • 重启
1
reboot

安装docker

  • 换科大源
1
2
3
4
5
6
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

sed -i 's+download.docker.com+mirrors.ustc.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 刷新缓存
yum makecache
  • 安装 docker
1
2
3
4
yum install docker-ce    # 默认安装最新版本

yum list docker-ce --showduplicates #查看当前镜像的docker版本
yum install --setopt=obsoletes=0 docker-ce-20.10.24-3.el7 #指定安装版本
  • 配置镜像加速地址
1
2
3
4
5
6
7
# 同时修改cgroupfs驱动为systemd,与kubelet一致否则kubelet启动失败
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://docker.1panel.live"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
  • 启动docker
1
2
3
systemctl  daemon-reload
systemctl start docker
systemctl enable docker

安装kubernetes组件

  • 更换国内镜像
1
2
3
4
5
6
7
8
9
10
# 1.28版本之前 阿里源
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
1
2
3
4
5
6
7
8
9
# 1.28版本以后 科大源(修改为自己需要的版本号)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.ustc.edu.cn/kubernetes/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
EOF
1
2
# 刷新缓存
yum makecache
  • 安装kubeadm,kubelet,kubectl
1
yum install --setopt=obsoletes=0 kubeadm-1.22.16-0 kubelet-1.22.16-0 kubectl-1.22.16-0
  • 配置kube的cgroup
1
2
3
4
5
# 编辑/etc/sysconfig/kubelet,添加如下配置
cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
EOF
1
2
# 设置开机自启
systemctl enable kubelet

准备集群镜像(好像只需在master节点上执行即可)

  • 查看所需镜像名称和版本号
1
kubeadm config images list

为保证后期初始化稳定,先从阿里云镜像仓库中下载镜像然后重新命名镜像名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 编写脚本k8simages.sh
echo '''
#!/bin/bash
images=(
kube-apiserver:v1.22.17
kube-controller-manager:v1.22.17
kube-scheduler:v1.22.17
kube-proxy:v1.22.17
pause:3.5
etcd:3.5.0-0
coredns:1.8.4
)

for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done ''' > k8simages.sh

# 增加执行权限
chmod +x k8simages.sh
# 执行脚本
./k8simages.sh
  • 查看docker镜像
1
docker images

集群初始化 (只需在master节点上执行即可)

  • 在master节点进行初始化
1
2
3
4
5
6
kubeadm init \
--kubernetes-version v1.22.16 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=10.0.0.7 #改为master节点ip
  • 根据提示在master节点执行
1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 在node节点执行
1
2
kubeadm join 10.0.0.7:6443 --token usyjf2.zk2p9syzru0gp1qp \
--discovery-token-ca-cert-hash sha256:934b5355c8ec53039fd40cc10b01ba7efe3b66b4036a27a49d12d38d8a93ba56
  • 查看集群状态
1
kubectl get nodes

安装网络插件flannel

  • 下载kube-flannel.yml(master节点)
1
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
  • 根据文件内容拉取所需镜像(所有节点)

1
2
docker pull docker.io/flannel/flannel:v0.25.4
docker pull docker.io/flannel/flannel-cni-plugin:v1.4.1-flannel1
  • 启动flannel(master节点)
1
kubectl apply -f kube-flannel.yml
  • 30s后查看集群状态
1
kubectl get nodes

如果长时间为 NotReady 状态,需要修改/var/lib/kubelet/kubeadm-flags. Env,删除 –network-plugin=cni
Vim /var/lib/kubelet/kubeadm-flags. Env
重新启动
Systemctl daemon-reload
Ystemctl restart kubelet

kubernetes部署nginx(node节点要能联网拉取镜像)

  • master节点执行
1
2
3
4
# 创建deployment
kubectl create deployment nginx --image=nginx:1.14-alpine
# 为nginx deployment创建服务,该服务在端口80上运行
kubectl expose deployment nginx --port=80 --type=NodePort
  • 查看pod和服务
1
kubectl get pods,service

  • 查看pod信息
1
kubectl describe pod nginx-65c4bffcb6-6pgj2

  • 访问


K8S手动部署
https://blog.erhuoyan.cn/2024/07/26/e86d9aa374cb/
作者
erhuoyan
发布于
2024年7月26日
许可协议