由于暑假到了以及天气原因,学校的k8s集群暂时关闭了,但是目前还是有使用k8s的需求,花了2个小时又重新搭了一下;
由于国内网络的问题,导致github包、镜像都很难拉下来,因此本文的内容更适合国内需求环境。
源代码:
debian12部署kubernetes-1.28集群 零、前置工作 0、环境校验 该部分内容来自于 K8S 官方文档 :
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
CPU 2 核心及以上。
集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
1、准备虚拟机
IP Address
Hostname
CPU
Memory
Storage
OS Release
Role
192.168.117.200
k1
4C
8G
100GB
Debian 12
Master
192.168.117.201
k2
4C
8G
100GB
Debian 12
Worker
192.168.117.202
k3
4C
8G
100GB
Debian 12
Worker
虚拟机安装、配置部分不再赘述了!
主要包括下面几个方面:
配置软件源;
配置静态IP;
配置 hosts 解析;
配置 SSH 免密登录;
安装必要工具:net-tools、wget、curl、htop等;
参考:
2、卸载docker(如有) 新版本的 k8s 和 docker 底层都依赖 containerd 容易造成冲突,直接卸载docker:
1 2 3 4 5 sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extrassudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerdsudo rm -rf /etc/docker
3、设置系统时区和时间同步 使用阿里云的时钟源:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 timedatectl set-timezone Asia/Shanghai apt-get install -y chrony sed -i "s/pool 2.debian.pool.ntp.org iburst/server ntp.aliyun.com iburst/g" /etc/chrony/chrony.conf systemctl restart chrony systemctl enable chrony chronyc sources
4、安装ipvs工具 在 Kubernetes 中,ipset 和 ipvsadm 的用途:
ipset 主要用于支持 Service 的负载均衡和网络策略。它可以帮助实现高性能的数据包过滤和转发,以及对 IP 地址和端口进行快速匹配。
ipvsadm 主要用于配置和管理 IPVS 负载均衡器,以实现 Service 的负载均衡。
执行:
1 apt-get install -y ipset ipvsadm
5、关闭服务 关闭 swap、防火墙等:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab systemctl stop apparmor.service systemctl disable apparmor.service ufw disable systemctl stop ufw.service systemctl disable ufw.service
6、内核优化 创建一个名为 kubernetes.conf 的内核配置文件,并写入以下配置内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 cat > /etc/sysctl.d/kubernetes.conf << EOF # 允许 IPv6 转发请求通过iptables进行处理(如果禁用防火墙或不是iptables,则该配置无效) net.bridge.bridge-nf-call-ip6tables = 1 # 允许 IPv4 转发请求通过iptables进行处理(如果禁用防火墙或不是iptables,则该配置无效) net.bridge.bridge-nf-call-iptables = 1 # 启用IPv4数据包的转发功能 net.ipv4.ip_forward = 1 # 禁用发送 ICMP 重定向消息 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # 提高 TCP 连接跟踪的最大数量 net.netfilter.nf_conntrack_max = 1000000 # 提高连接追踪表的超时时间 net.netfilter.nf_conntrack_tcp_timeout_established = 86400 # 提高监听队列大小 net.core.somaxconn = 1024 # 防止 SYN 攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 # 提高文件描述符限制 fs.file-max = 65536 # 设置虚拟内存交换(swap)的使用策略为0,减少对磁盘的频繁读写 vm.swappiness = 0 EOF
加载或启动内核模块 br_netfilter,该模块提供了网络桥接所需的网络过滤功能
查看是否已成功加载模块:
1 lsmod | grep br_netfilter
将读取该文件中的参数设置,并将其应用到系统的当前运行状态中:
1 sysctl -p /etc/sysctl.d/kubernetes.conf
参考:
7、内核模块配置 将自定义在系统引导时自动加载的内核模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 cat > /etc/modules-load.d/kubernetes.conf << EOF # /etc/modules-load.d/kubernetes.conf # Linux 网桥支持 br_netfilter # IPVS 加载均衡器 ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh # IPv4 连接跟踪 nf_conntrack_ipv4 # IP 表规则 ip_tables EOF
添加可执行权限:
1 chmod a+x /etc/modules-load.d/kubernetes.conf
8、安装containerd运行时
以下指令适用于 Kubernetes 1.28!
(1)安装 安装 containerd:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 wget https://github.com/containerd/containerd/releases/download/v1.7.21/cri-containerd-1.7.21-linux-amd64.tar.gz tar xf cri-containerd-1.7.21-linux-amd64.tar.gz -C / mkdir /etc/containerdcontainerd config default > /etc/containerd/config.toml sed -i 's#registry.k8s.io/pause:3.8#registry.aliyuncs.com/google_containers/pause:3.9#' /etc/containerd/config.toml sed -i '/SystemdCgroup/s/false/true/' /etc/containerd/config.toml
(2)配置脚本 配置启动脚本:
/lib/systemd/system/containerd.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [Unit] Description =containerd container runtimeDocumentation =https://containerd.ioAfter =network.target local-fs.target[Service] ExecStartPre =-/sbin/modprobe overlayExecStart =/usr/local/bin/containerdType =notifyDelegate =yes KillMode =processRestart =alwaysRestartSec =5 LimitNPROC =infinityLimitCORE =infinityTasksMax =infinityOOMScoreAdjust =-999 [Install] WantedBy =multi-user.target
执行配置:
1 2 3 4 5 6 7 8 9 10 11 12 systemctl enable --now containerd.service systemctl status containerd.service containerd --version crictl --version runc --version crictl config runtime-endpoint unix:///run/containerd/containerd.sock
一、安装组件 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sudo apt-get updatesudo apt-get install -y apt-transport-https ca-certificates curl gpgcurl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get updatesudo apt-get install -y kubelet=1.28.13-1.1 kubeadm=1.28.13-1.1 kubectl=1.28.13-1.1sudo apt-mark hold kubelet kubeadm kubectl
配置 kubelet 开机启动:
1 systemctl enable kubelet
二、初始化集群 1、初始化集群(Master节点执行)
本小节在 master 节点执行!
生成配置文件:
1 kubeadm config print init-defaults > kubeadm.yaml
配置文件如下:
kubeadm.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration nodeRegistration: criSocket: unix:///run/containerd/containerd.sock imagePullPolicy: IfNotPresent 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.cn-hangzhou.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: 1.28 .13 controlPlaneEndpoint: 192.168 .117 .200 :6443 networking: dnsDomain: cluster.local serviceSubnet: 10.254 .0 .0 /16 podSubnet: 10.255 .0 .0 /16 scheduler: {}--- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs
验证镜像仓配置是否生效。
1 kubeadm config images list --config=kubeadm.yaml
提前拉取镜像。
1 kubeadm config images pull --config=kubeadm.yaml
查看镜像是否下载。
开始初始化。
1 kubeadm init --config=kubeadm.yaml
安装完会有加入集群的相关指令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join 192.168.117.200:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:91a2398cbadf3967950dc6900e7411d5319e82ad30e139a1163896f9a8c61234 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.117.200:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:91a2398cbadf3967950dc6900e7411d5319e82ad30e139a1163896f9a8c61234
2、Worker加入集群(Worker节点)
此小节在 worker 节点执行!
执行加入脚本:
1 2 kubeadm join 192.168.117.200:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:91a2398cbadf3967950dc6900e7411d5319e82ad30e139a1163896f9a8c61234
等待后即可加入!
3、Master节点污点(可选) 默认情况下 Master 节点为 control-plane,无法部署服务;
可以通过执行:
1 2 3 4 5 6 kubectl describe node k1 |grep Taints Taints: node-role.kubernetes.io/control-plane:NoSchedule kubectl taint node k1 node-role.kubernetes.io/control-plane:NoSchedule-
启用 master 节点调度!
补:其他节点使用kubectl 其他节点默认是无法直接使用 kubectl 管理集群的,我们只需要将配置文件复制到其他节点即可!
方法一:拷贝master节点的/etc/kubernetes/admin.conf 到nodes节点中的同样的目录/etc/kubernetes/ ,然后再配置环境变量
1 [root@k8s-node1 qq-5201351]# scp k8s-master:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
然后再配置环境变量:
1 2 echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bash_profilesource ~/.bash_profile
方法二:拷贝master节点的/etc/kubernetes/admin.conf 到nodes节点的$HOME/.kube目录,并且命名为config
因为默认是没有 $HOME/.kube 目录的,先进行创建:
mkdir -p $HOME/.kube
scp k8s-master:/etc/kubernetes/admin.conf $HOME/.kube/config
三、网络插件 1、安装Calico k8s 部署完成后还不能使用,需要配置网络插件,从而为 Pod 分配 IP,打通网络等等。
Calico是 目前开源的最成熟的纯三层网络框架之一 , 是一种广泛采用、久经考验的开源网络和网络安全解决方案,适用于 Kubernetes、虚拟机和裸机工作负载。 Calico 为云原生应用提供两大服务:工作负载之间的网络连接和工作负载之间的网络安全策略。
Calico 访问链接:projectcalico.docs.tigera.io/about/
在这里使用 calico 来做为集群的网络插件,官网提供2种安装方式:
operator 的方式修改镜像比较麻烦,这里不使用;
通过yaml配置文件的方式;
1 curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml -O
配置:
修改 CALICO_IPV4POOL_CIDR 为我们的网段(本文为:10.254.0.0/16)
修改 CALICO_IPV4POOL_IPIP 为 Always 启用 ipip 协议;
1 2 3 4 5 6 7 8 - # - name: CALICO_IPV4POOL_CIDR - # value: "192.168.0.0/16" + - name: CALICO_IPV4POOL_CIDR + value: "10.254.0.0/16" # Enable IPIP + - name: CALICO_IPV4POOL_IPIP + value: "Always"
修改镜像地址:
搜索 image: 将镜像修改:
1 2 3 4 5 6 7 8 - image: docker.io/calico/cni:v3.28.1 + image: registry.cn-hangzhou.aliyuncs.com/jasonkay/cni:v3.28.1 - image: docker.io/calico/node:v3.28.1 + image: registry.cn-hangzhou.aliyuncs.com/jasonkay/node:v3.28.1 - image: docker.io/calico/kube-controllers:v3.28.1 + image: registry.cn-hangzhou.aliyuncs.com/jasonkay/kube-controllers:v3.28.1
即,将:docker.io/calico 替换为 registry.cn-hangzhou.aliyuncs.com/jasonkay (我在阿里云上同步的镜像)!
随后执行:
1 kubectl apply -f calico.yaml
等待部署完成即可!
2、验证 验证 coredns dns 转发是否正常:
1 2 3 4 5 6 7 8 9 10 apt install -y dnsutils kubectl get svc -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns ClusterIP 10.254.0.10 <none> 53/UDP,53/TCP,9153/TCP 15h dig -t a www.baidu.com @10.254.0.10
四、部署应用测试 部署 nginx 进行测试:
nginx-deploy.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/jasonkay/nginx:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 31080
应用:
1 kubectl apply -f nginx-deploy.yaml
然后访问 k8s-ip:31080,能够正常访问 Nginx!
五、安装Helm Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 的 Apt 或 Yum;
这个工具能帮助开发者和系统管理员更方便地管理在 Kubernetes 集群上部署、更新、卸载应用。
Helm 中的三个主要概念:
概念
描述
Chart
在 Kubernetes 集群上部署应用所需的所有资源定义的包
Release
在 Kubernetes 集群上部署的 Chart 的实例
Repository
Chart 的存储位置,类似软件仓库,用于分发和分享 Chart
安装脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1. 添加 Helm 的官方 GPG key root@k8s-master:~# curl https://baltocdn.com/helm/signing.asc | gpg --dearmor -o /usr/share/keyrings/helm-keyring.gpg 2. 添加 Helm 的官方 APT 仓库 root@k8s-master:~# echo "deb [signed-by=/usr/share/keyrings/helm-keyring.gpg] https://baltocdn.com/helm/stable/debian/ all main" | tee /etc/apt/sources.list.d/helm-stable-debian.list 3. 更新 apt 源 root@k8s-master:~# apt-get update 4. 安装 Helm root@k8s-master:~# apt-get install -y helm 5. 检查 Helm 是否已正确安装 root@k8s-master:~# helm version version.BuildInfo{Version:"v3.13.3" , GitCommit:"c8b948945e52abba22ff885446a1486cb5fd3474" , GitTreeState:"clean" , GoVersion:"go1.20.11" }
六、安装面板KubeSphere 官方提供的面板不太好用,这里推荐使用 KubeSphere;
配置下载区域:
安装也很简单,使用 helm 即可,而且支持国内:
1 2 3 4 5 6 helm upgrade --install -n kubesphere-system \ --create-namespace ks-core \ https://charts.kubesphere.com.cn/main/ks-core-1.1.4.tgz \ --debug --wait \ --set global.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks \ --set extension.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks
等待所有 Pod 就绪后,安装完成,显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 NOTES: Thank you for choosing KubeSphere Helm Chart. Please be patient and wait for several seconds for the KubeSphere deployment to complete. 1. Wait for Deployment Completion Confirm that all KubeSphere components are running by executing the following command: kubectl get pods -n kubesphere-system 2. Access the KubeSphere Console Once the deployment is complete, you can access the KubeSphere console using the following URL: http://192.168.6.10:30880 3. Login to KubeSphere Console Use the following credentials to log in: Account: admin Password: P@88w0rd NOTE: It is highly recommended to change the default password immediately after the first login. For additional information and details, please visit https://kubesphere.io.
执行以下命令检查 Pod 状态。
1 kubectl get pods -n kubesphere-system
当 Pod 状态都为 Running 时,使用默认的账户和密码 (admin/P@88w0rd) 通过 <NodeIP>:30880 访问 KubeSphere Web 控制台!
七、工具推荐 1、kubectx 推荐安装 kubectx,可以切换k8s上下文(管理多个集群);
并且 kubectx 自带了另一个工具:kubens,可以方便切换默认的 namespace;
安装:
2、nerdctl nerdctl 可以提供在宿主机上类 docker 的操作(操作 containerd),可以提升用户体验:
1 2 3 4 cd /tmpwget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-1.7.6-linux-amd64.tar.gz tar xf nerdctl-1.7.6-linux-amd64.tar.gz mv nerdctl /usr/sbin
附录 参考文章:
源代码: