主机名 | IPv4地址 | IPv6地址 | 角色 | 安装组件 | 操作系统 |
k8s130-node190 | 192.168.XX.190 | 240a:XX::190 | master | kubeadm、kubelet、containerd | Anolis OS 8.9+4.19.91-28.1.an8.x86_64 |
k8s130-node191 | 192.168.XX.191 | 240a:XX::191 | node | kubeadm、kubelet、cri-o | Anolis OS 8.9+4.19.91-28.1.an8.x86_64 |
k8s130-node189 | 192.168.XX.189 | 240a:XX::189 | node | kubeadm、kubelet、cri-dockerd | Anolis OS 8.9+4.19.91-28.1.an8.x86_64 |
安装前准备
1、最小化安装虚拟机,安装完之后需要更新到最新
~]# yum -y update
2、关闭防火墙
~]# systemctl disable firewalld && systemctl stop firewalld
3、关闭SELinux
~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
4、确保时间同步服务运行正常,并且可以成功同步时间
~]# systemctl status chronyd -l --no-pager
5、安装必须的一些软件包
~]# yum -y install ipvsadm ipset conntrack-tools iproute-tc conntrack libseccomp wget tar
6、启用内核模块
~]# modprobe ip_conntrack
~]# modprobe nf_conntrack
~]# modprobe ip_vs
~]# modprobe ip_vs_rr
~]# modprobe ip_vs_rr
~]# modprobe ip_vs_wrr
~]# modprobe ip_vs_sh
~]# modprobe br_netfilter
~]# modprobe bridge
7、配置内核参数
~]# cat /etc/sysctl.d/99-sysctl.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
net.ipv6.conf.all.forwarding=1
net.ipv4.ip_forward=1
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh2=2048
net.ipv4.neigh.default.gc_thresh3=4096
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 21000 61000
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
8、关闭swap(在装虚拟机分区时就不做swap最好)
a、swapoff -a
b、注释/etc/fstab中的swap挂载
安装Containerd
containerd最初是Docker引擎的一部分,作为Docker的核心组件负责容器的创建、运行和管理。2017年,Docker决定将containerd作为一个独立的开源项目,以便社区能够更广泛地使用和贡献。containerd的目标是提供一个简单、稳定且高效的容器运行时,它可以作为各种容器生态系统的基础,特别是在与Kubernetes的集成方面。
1、配置第三方镜像源(在线安装Containerd需要配置docker-ce的镜像源,如果不想或者不能在线安装,那么可以通过其他方式:Getting started with containerd)
注:
a、这两种方式安装结果还是有很大不同的;
b、下面使用的是阿里镜像源,docker官方镜像源被qiang了
~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
~]# yum repolist|grep docker
docker-ce-stable Docker CE Stable - x86_64
2、安装Containerd最新版
~]# yum -y install containerd.io --disableexcludes=docker-ce-stable
3、设置开机启动
systemctl enable containerd
4、设置Containerd
docker-ce的配置文件是/etc/docker/daemon.json ,那么Containerd的呢?答案:/etc/containerd/config.toml。但是,通过docker镜像源在线安装的Containerd的配置文件不可用,需要重新生成配置文件。
mv /etc/containerd/config.toml{,_docker}
containerd config default > /etc/containerd/config.toml
4.1、配置sandbox_image
早先使用dockershim时,只需要配置kubelet的--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9即可,如果要使用containerd作为kubernetes的运行时,pod-infra-container-image将不生效(不过kubeadm启动kubernetes组件时仍然会用到)
< sandbox_image = "registry.k8s.io/pause:3.6"
---
> sandbox_image = "192.168.XX.XX/kubeadm/pause:3.9"
4.2、设置SystemdCgroup && 配置私有仓库认证信息
……
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "192.168.XX.XX/kubeadm/pause:3.7"
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
……
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.XX.XX".auth]
username = "admin"
password = "密码"
[plugins."io.containerd.grpc.v1.cri".registry.headers]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.XX.XX"]
endpoint = ["http://192.168.XX.XX"]
4.3、Containerd的客户端命令配置
docker-ce的客户端命令就是docker,Containerd的客户端命令crictl和ctr,一般使用crictl,需要配置一下,否则~~哼哼
cat /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
5、启动Containerd
systemctl start containerd
安装kubeadm、kubelet、kubectl
1、配置第三方镜像源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
2、安装kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
初始化kubernetes master节点
1、生成初始化YAML文件
kubeadm config print init-defaults > kubeadm-init.default.yaml
2、设置初始化文件。如下红色内容需要根据需要修改,另外,advertiseAddress只支持IPv4。
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.XX.190
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s130-node190
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.30.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.254.0.0/16,2408:822a:730:af01::/112
podSubnet: 172.254.0.0/16,fa00:cafe:42::/56
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
iptables:
masqueradeAll: false
ipvs:
minSyncPeriod: 0s
scheduler: "rr"
kind: KubeProxyConfiguration
mode: "ipvs"
3、初始化master节点
kubeadm init --config=kubeadm-init.default.yaml |tee kubeadm-init.log
打印如下内容,则表明初始化成功。另外,根据初始化文件中定义的ttl: 24h0m0s,token的有效期是24小时,过期之后,将无法使用如下打印的token加入kubernetes集群。
安装之后处理
1、验证
~]$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s130-node190 NotReady control-plane 3m44s v1.30.2
执行kubectl get node,node是NotReady状态 ! --- --- 没有安装网络插件
执行kubectl get po,pod中coredns是Pending状态! --- --- 没有安装网络插件
安装网络插件-Calico
1、下载Calico启动配置文件
wget https://mirrors.chenby.cn/https://github.com/projectcalico/calico/blob/master/manifests/calico-typha.yaml
2、定制Calico配置文件
2.1、配置启用IP双栈(无需IPv6,则不需要配置)
< "type": "calico-ipam"
---
> "type": "calico-ipam",
> "assign_ipv4": "true",
> "assign_ipv6": "true"
2.2、配置IP地址段(无需IPv6,则只需配置IPv4即可)
< # - name: CALICO_IPV4POOL_CIDR
< # value: "192.168.0.0/16"
< - name: FELIX_IPV6SUPPORT
< value: "true"
---
> - name: CALICO_IPV4POOL_CIDR
> value: "172.254.0.0/16"
> - name: CALICO_IPV6POOL_CIDR
> value: "fa00:cafe:42::/56"
> - name: IP_AUTODETECTION_METHOD
> value: "interface=ens.*"
> - name: IP6_AUTODETECTION_METHOD
> value: "interface=ens.*"
> - name: FELIX_IPV6SUPPORT
> value: "true"
2.3、修改镜像地址(无fan墙能力就得老老实实改)
< image: docker.io/calico/cni:master
---
> image: 192.168.XX.XX/library/cni:master
< image: docker.io/calico/node:master
---
> image: 192.168.XX.XX/library/node:master
< image: docker.io/calico/kube-controllers:master
---
> image: 192.168.XX.XX/library/kube-controllers:master
< image: docker.io/calico/typha:master
---
> image: 192.168.XX.XX/library/typha:master
2.4、创建Calico
kubectl apply -f calico-typha.yaml
2.5、验证是否成功
Calico Typha启动的pod有3类:controller、node、typha。状态都变成Running,且Ready为1/1才表明成功了。controller是由deploy调度创建、node由daemonset调度创建(确保每个node上都启动一个calico-node,并且使用hostNetwork)
3、Calico组件说明
3.1. Calico Node
Calico Node 是 Calico 的核心组件,运行在每个集群节点上,负责以下任务:
- IPAM(IP Address Management):管理分配和回收 Pod 的 IP 地址。
- BGP(Border Gateway Protocol):使用 BGP 与其他 Calico 节点进行路由信息交换,确保网络中的所有 Pod 可以相互通信。
- 网络策略实施:通过 iptables 或 eBPF 实施网络策略,控制 Pod 之间的流量。
- Felix:Calico Node 包含 Felix 代理,负责与 Linux 内核网络栈交互,应用网络策略和管理路由。
3.2. Calico Controller
Calico Controller 是一个 Kubernetes 控制器,负责管理 Calico 与 Kubernetes API 之间的交互。其主要职责包括:
- 同步 Calico 和 Kubernetes 对象:确保 Calico 的网络策略、IP 池和其他配置与 Kubernetes 中定义的对象保持一致。
- 管理 Kubernetes 服务:处理 Kubernetes 服务对象,确保服务的 IP 地址正确配置,并与 Calico 网络策略兼容。
- 确保高可用性:通过定期检查和同步,确保 Calico 配置的一致性和高可用性。
3.3. Calico Typha
Calico Typha 是一个可选的组件,主要用于大规模 Kubernetes 集群,以减少 API 服务器的负载和提高性能。其职责包括:
- 聚合和分发数据:从 Kubernetes API 服务器获取更新,并将这些更新分发给集群中的 Calico Node 实例。
- 减少 API 请求数量:通过集中处理和分发数据,Typha 减少了直接与 API 服务器通信的 Calico Node 实例数量,从而降低了 API 服务器的负载。
- 提高集群性能:在大规模集群中,Typha 帮助减少网络流量和提高配置分发效率,从而提高整体性能。
3.4. 总结
- Calico Node 是 Calico 的核心组件,负责管理节点上的网络配置和策略实施。
- Calico Controller 负责 Calico 与 Kubernetes API 的交互,确保配置一致性和高可用性。
- Calico Typha 用于大规模集群中,聚合和分发数据,减少 API 服务器的负载,提高性能。
下一篇:《kubernetes集群部署:node节点部署和CRI-O运行时安装(三)》