Kubernetes网络和安装
Kubernetes网络和安装
基本概述
Kubernetes的网络模型假定所有的pod都在一个可以直接连通的扁平的网络空间中。在私有云搭建Kubernetes集群时,需要自己实现这个网络假设,让不同节点上的docker容器之间相互打通,然后在运行Kubernetes。
Kubernetes 网络模型原则
- 在不使用网络地址转换NAT的情况下,集群的pod能够与任何其他的pod通信。
- 在不使用网络地址转换NAT的情况下,在集群节点上运行的程序能与同一节点上的任何pod通信。
- 每个pod都有自己的IP地址,并且任意其他pod都可以通过相同的这个地址访问他。
CNI接口
CNI接口是指对可执行的程序的调用可执行程序。Kubernetes节点默认的CNI插件路径是/opt/cni/bin
。CNI通过 JSON 格式的配置文件来描述网络配置,由容器运行时(CRI)负责执行CNI插件,并通过 CNI插件的标准输入来传递配置文件信息,通过标准输出接收插件的执行结果。
目前主流的网络解决方案-calico
Calico 是一个纯三层的虚拟网络,它没有复用 docker 的 docker0 网桥,而是自己实现的。Calico 网络不对数据包进行额外封装,不需要 NAT 和端口映射。
安装方式
kubeadm
组件通过容器化方式运行。
二进制安装
组件变成系统进程的方式运行。
安装脚本
1. 网卡配置
对于网卡这边是使用了两个网卡一个是仅主机一个是NAT,我是三台虚拟机和一个ikuai的虚拟路由用来监控。
# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[ipv4]
method=manual
address1=192.168.66.12/24,192.168.66.200
dns=114.114.114.114;8.8.8.8
# cat /etc/NetworkManager/system-connections/ens192.nmconnection
[connection]
autoconnect=false
2. 配置docker
复制代码
# Rocky 系统软件源更换
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/[Rr]ocky*.repo
dnf makecache
# 防火墙修改 firewalld 为 iptables
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
iptables -F
systemctl enable iptables
service iptables save
# 禁用 Selinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
grubby --update-kernel ALL --args selinux=0
# 设置时区
timedatectl set-timezone Asia/Shanghai
# 关闭 swap 分区
swapoff -a
sed -i 's:/dev/mapper/rl-swap:#/dev/mapper/rl-swap:g' /etc/fstab
# 修改主机名
hostnamectl set-hostname k8s-node01
# 安装 ipvs
yum install -y ipvsadm
# 开启路由转发
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
# 加载 bridge
yum install -y epel-release
yum install -y bridge-utils
modprobe br_netfilter
echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf
echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf
echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf
sysctl -p
# 添加 docker-ce yum 源
sudo dnf config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
cd /etc/yum.repos.d
sed -e 's|download.docker.com|mirrors.ustc.edu.cn/docker-ce|g' docker-ce.repo
# 安装 docker-ce
yum -y install docker-ce
# 配置 daemon.
cat > /etc/docker/daemon.json <<EOF
{
"data-root": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "100"
},
"insecure-registries": ["harbor.xinxainghf.com"],
"registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
3. 安装 cri-docker
复制代码
# 解压 cri-docker
tar -zxvf cri-dockerd-0.3.9.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/bin/
# 分发到其他虚拟机
chmod +x /usr/bin/cri-dockerd
# 配置 cri-docker 服务
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 添加 cri-docker 套接字
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 启动 cri-docker 对应服务
systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker
4. 安装 kubeadm
复制代码
# 添加 kubeadm yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# 安装 kubeadm 1.29.2版本
tar -zxvf kubernetes-1.29.2-150500.1.1.tar.gz
cd kubernetes-1.29.2-150500.1.1
yum -y install *
# 分发到其他虚拟机
systemctl enable kubelet.service
5. 初始化主节点
复制代码
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.193.50 --kubernetes-version=v1.29.2 --cri-socket=unix:///var/run/cri-dockerd.sock
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
# work token 过期后,重新申请
kubeadm token create --print-join-command
# worker 加入
kubeadm join 192.168.193.11:6443 --token a6xh07.yg9wh2vru2grluwb --discovery-token-ca-cert-hash sha256:7cd8499abae48c8403800152cc0f655ac704ea00ae30a549acd9bbac7b26dca4 --cri-socket unix:///var/run/cri-dockerd.sock
6. 解决加入节点问题
复制代码
# 停止 kubelet 和 docker
systemctl stop kubelet
systemctl stop docker
# 清理 iptables
iptables --flush
iptables -tnat --flush
# 启动 kubelet 和 docker
systemctl start kubelet
systemctl start docker
# 重新生成 token 并加入节点
kubeadm token create --print-join-command
kubeadm join 192.168.193.50:6443 --token 7ounwq.wlgf1sex31q9s59x \
--discovery-token-ca-cert-hash sha256:57d4ca3fd382f0f19e87afa224d0dfd81625fdbc73eb5ede475877077ab640c8 --cri-socket unix:///var/run/cri-dockerd.sock
7. 安装 Calico
复制代码
# 安装 unzip
yum install unzip -y
# 解压 calico
unzip calico.zip
cd calico
tar -zxvf calico-images.tar.gz
# 加载 calico 镜像
docker load -i calico-images/calico-cni-v3.26.3.tar
docker load -i calico-images/calico-node-v3.26.3.tar
docker load -i calico-images/calico-kube-controllers-v3.26.3.tar
docker load -i calico-images/calico-typha-v3.26.3.tar
# 分发 calico 镜像到其他节点
scp -r calico-images root@n1:/root/
scp -r calico-images root@n2:/root/
# 其他节点加载 calico 镜像
docker load -i calico-images/calico-cni-v3.26.3.tar
docker load -i calico-images/calico-node-v3.26.3.tar
docker load -i calico-images/calico-kube-controllers-v3.26.3.tar
docker load -i calico-images/calico-typha-v3.26.3.tar
# 应用 calico 配置
kubectl apply -f calico-typha.yaml
核心组件在/etc/kubernetes/manifests/
etcd.yaml:
这是 etcd 的静态 Pod 清单文件。etcd 是 Kubernetes 集群的键值存储数据库,用于存储集群的所有配置数据和状态信息。
kube-apiserver.yaml:
这是 Kubernetes API 服务器的静态 Pod 清单文件。API 服务器是 Kubernetes 控制平面的前端,负责处理内部和外部的 API 请求,并管理集群的状态。
kube-controller-manager.yaml:
这是 Kubernetes 控制器管理器的静态 Pod 清单文件。控制器管理器运行各种控制器进程,这些进程负责维护集群的状态,例如副本集、部署等。
kube-scheduler.yaml:
这是 Kubernetes 调度器的静态 Pod 清单文件。调度器负责决定将 Pod 调度到哪个节点上运行。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Floating Dream!
评论