kubernetes安装部署
> 官方推荐kubeadm部署配置:2核2G内存,卸载防火墙、禁用swap
>
>环境部署
>
>```
> # 实验机清单
> harbor: 镜像仓库
> -> 192.168.88.240 # 2CPU,4G内存
> master: 管理控制节点
> -> 192.168.88.50 # 2CPU,4G内存
> node-0001: 计算节点1
> -> 192.168.88.51 # 2CPU,2G内存
> node-0002: 计算节点2
> -> 192.168.88.52 # 2CPU,2G内存
> node-0003: 计算节点3
> -> 192.168.88.53 # 2CPU,2G内存
> ```
>
>#登录harbor的测试普通用户
> 用户名:user
> 密码:ABCdef123
#### 一、k8s安装
##### 安装控制节点
###### 前置软件包安装与系统环境配置
```shell
## 配置软件仓库
# 传输安装包,k8s需要containerd.io、kubeadm、kubectl、kubelet、kubernetes-cni、cri-tools
rsync -av ... 192.168.88.240:/var/ftp/rpms
# 更新本地yum仓库
createrepo --update /var/ftp/rpms/
----------------------------------------------------------start
## 系统环境配置
# 创建repo源
echo '
[k8s]
name=Rocky Linux $releasever - Kubernetes
baseurl="ftp://192.168.88.240/rpms"
enabled=1
gpgcheck=0 ' >> /etc/yum.repos.d/k8s.repo
# 为所有实验机传输yum源
path=/etc/yum.repos.d/local.repo
for i in 5{0..3}
do
rsync -av $path 192.168.88.$i:$path
done
# 禁用 firewall 和 swap
sed -i '/swap/d' /etc/fstab
swapoff -a
dnf remove -y firewalld*
## 安装工具软件包简介
#kubeadm: 集群配置工具
#kubelet: 管理pod,在集群中的每个节点上启动
#kubectl: 用来与集群通信的命令行工具
#containerd: 容器管理软件 (Runtime)
#ipvsadm: 集群管理工具
#iproute-tc: 网络流量管理工具
# master节点安装前置包
dnf install -y kubeadm kubelet kubectl containerd.io ipvsadm ipset iproute-tc
# 配置containerd文件
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
61 配置私有仓库的镜像路径
sandbox_image = "harbor:443/k8s/pause:3.9"
125 k8s调用containerd驱动
SystemdCgroup = true # 默认false,则调用Cgroupfs启动
154 定义私有仓库地址[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://192.168.88.240:443"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor:443"]
endpoint = ["https://192.168.88.240:443"] [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.88.240:443".tls]
insecure_skip_verify = true
# 验证kubelet的cgroup驱动配置
cat /var/lib/kubelet/config.yaml | grep cgroupDriver
```

> ##### Kubernetes 核心组件端口及用途表
>
> | 软件名称 | 端口范围 | 用途 |
> | ------------------------- | --------- | ------------------ |
> | `kubernetes-api` | 6443 | 所有组件接口服务 |
> | `etcd` | 2379-2380 | 核心数据库 |
> | `kube-scheduler` | 10259 | 调度服务 |
> | `kube-controller-manager` | 10257 | 控制器管理服务 |
> | `kubelet` | 10250 | 节点代理服务 |
> | `kube-proxy` | 10256 | 网络通讯与负载均衡 |
###### 配置内核参数
```shell
# 查看内核模块
lsmod
# 加载内核模块
vim /etc/modules-load.d/containerd.conf
br_netfilter
xt_conntrack
systemctl start systemd-modules-load.service
# 设置内核参数
vim /etc/sysctl.d/99-kubernetes-cri.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.netfilter.nf_conntrack_max = 1000000
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
----------------------------------------------------------end
```
##### 导入 k8s 镜像
```shell
# 将init文件传输给master
rsync -av kubernetes/init 192.168.88.50:/root/
## 安装部署 docker
dnf install -y docker-ce
# 配置harbor镜像地址
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://harbor:443"],
"insecure-registries":["harbor:443"]
}
# 重启服务生效,并验证地址是否生效
systemctl enable --now docker;docker info
##上传镜像到 harbor 仓库
# 登录harbor用户
docker login harbor:443 # 输入普通用户的用户名&密码
# 导入镜像
docker load -i init/v1.29.2.tar.xz
# 上传镜像
docker images | while read i t _
do
[[ "${t}" == "TAG" ]] && continue
[[ "${i}" =~ ^"harbor:443/".+ ]] && continue # 从仓库下载的镜像带有harbor:443,跳过
docker tag ${i}:${t} harbor:443/k8s/${i##*/}:${t}
docker push harbor:443/k8s/${i##*/}:${t}
docker rmi ${i}:${t} harbor:443/k8s/${i##*/}:${t}
done
# 设置 Tab 键补全命令
source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
source <(kubectl completion bash|tee /etc/bash_completion.d/kubectl)
# 上述两条命令用于Bash自动补全功能,即kubeadm子命令自动补全,提高工作效率
```
##### master 安装集群并启动
```shell
# 修改master
vim +13 /root/init/init.yaml
advertiseAddress: 192.168.88.50 #修改为master的ip
# 测试系统环境
kubeadm init --config=init/init.yaml --dry-run 2>error.log
# 测试正常error不会有任何内容
cat error.log
# 主控节点初始化
rm -rf error.log /etc/kubernetes/tmp
kubeadm init --config=init/init.yaml | tee init/init.log
## 管理授权,如果缺少授权,执行命令会报错权限不足
# 如果上述命令执行报错,说明前面步骤有误,会输出:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/tmp/kubeadm-init-dryrun1749378166/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 若前面执行成功,会输出:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
将输出的三条命令重新输入执行授权
# 验证节点工作状态
kubectl get nodes
```
执行成功后终端输出结果
<img src="image-20250326134459766.png" alt="image-20250326134459766" style="zoom:150%;" />
###### 至此——k8s集群部署完毕
--------------
> ###### kubeadm工具
>
> | 命令选项 | 命令说明 |
> | -------- | ---------------------------------- |
> | `config` | 镜像管理命令 |
> | `init` | 集群初始化命令 |
> | `reset` | 还原、删除集群配置 |
> | `join` | 计算节点加入集群 |
> | `token` | Token 凭证管理,管理加入集群的凭证 |
> | `help` | 命令帮助信息 |
>
> 如果前面创建集群命令执行失败,执行reset初始化集群至配置前
#### 二、安装网络插件
> 查看节点:kubectl get nodes
> 显示notready,未上线需要网络
```shell
# 拷贝插件并上传镜像
rsync -av kubernetes/plugins/calico 192.168.88.50:/root/
docker load -i plugins/calico/calico.tar.xz
docker images | while read i t _
do
[[ "${t}" == "TAG" ]] && continue
[[ "${i}" =~ ^"harbor:443/".+ ]] && continue
docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
docker push harbor:443/plugins/${i##*/}:${t}
docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
done
```
##### 安装部署插件 calico
```shell
grep -n image: calico.yaml # 清单文件
4642: image: docker.io/calico/cni:v3.26.4
4670: image: docker.io/calico/cni:v3.26.4
4713: image: docker.io/calico/node:v3.26.4
4739: image: docker.io/calico/node:v3.26.4
4956: image: docker.io/calico/kube-controllers:v3.26.4
# 查看清单文件image显示官方github地址,修改地址为harbor地址下的plugins分支
sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' calico.yaml
grep -n image: calico.yaml # 再次执行查看修改
4642: image: harbor:443/plugins/cni:v3.26.4
4670: image: harbor:443/plugins/cni:v3.26.4
4713: image: harbor:443/plugins/node:v3.26.4
4739: image: harbor:443/plugins/node:v3.26.4
4956: image: harbor:443/plugins/kube-controllers:v3.26.4
```
#### 三、token管理
##### 获取凭证
```shell
## k8s集群的凭证管理操作
# 查看token凭证有效期
kubeadm token list # 得到一个有期限为21小时的凭证
# 删除旧token
kubeadm token delete abcdef.0123456789abcdef
# 创建永久token凭证,并记录返回的命令
kubeadm token create --ttl=0 --print-join-command
#--ttl=0:令牌永久有效(查询结果显示为<forever>)
#--print-join-command:直接输出节点加入集群的命令
kubeadm join 192.168.88.50:6443 --token tonuv1.cqiayofavyb029y8 --discovery-token-ca-cert-hash sha256:66cacdaeee2993132efbf6bbf360cafcbbc36a72138c198fc5ca444e1327eb15
# 若丢失sha256,使用以下命令通过openssl计算得到hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der | openssl dgst -sha256 -hex
### 为集群添加计算节点
在node[1-3]三台实验机上重新执行命令:从虚线start到虚线end结束
# 验证节点工作状态
最后在master管理节点上查看: kubectl get nodes # 稍等1分钟,等待分配ip配置网络
# 验证容器工作状态
kubectl -n kube-system get pods
```
###### ansible自动化添加集群计算节点
```shell
- hosts: all
vars:
master: "192.168.88.50:6443"
token: "--token tonuv1.cqiayofavyb029y8 --discovery-token-ca-cert-hash"
token_hash: "sha256:66cacdaeee2993132efbf6bbf360cafcbbc36a72138c198fc5ca444e1327eb15"
tasks:
# 1. 配置YUM仓库
- yum_repository:
name: k8s
description: Rocky Linux $releasever - Kubernetes
baseurl: ftp://192.168.88.240/rpms
enabled: 1
gpgcheck: 0
# 2. 系统配置优化
- replace:
path: /etc/fstab
regexp: '^.*swap.*$'
replace: ''
- yum:
name: firewalld
state: absent
- shell: swapoff -a
# 3. 基础配置
# #dns解析才能dnf安装,不能加入循环
- copy:
src: "/etc/hosts"
dest: "/etc/hosts"
# 4. 安装软件包
- yum:
name: "{{ item }}"
state: present
loop:
- kubeadm
- kubelet
- kubectl
- containerd.io
- ipvsadm
- ipset
- iproute-tc
# 5. Containerd配置
- shell: containerd config default > /etc/containerd/config.toml
- copy:
src: /etc/containerd/config.toml
dest: /etc/containerd/config.toml
- service:
name: kubelet
state: started
enabled: yes
# 6. 内核配置
- copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
loop:
- { src: '/etc/modules-load.d/containerd.conf', dest: '/etc/modules-load.d/containerd.conf'}
- { src: '/etc/sysctl.d/99-kubernetes-cri.conf', dest: '/etc/sysctl.d/99-kubernetes-cri.conf'}
# 7. 服务管理
- service:
name: "{{ item.server }}"
state: started
enabled: yes
loop:
- { server: 'containerd' }
- { server: 'systemd-modules-load' }
- shell: sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
# 8. 加入集群
- shell: kubeadm join {{ master }} --token {{ token }} --discovery-token-ca-cert-hash {{ token_hash }}
```
--------------------
#### 扩展内容
##### 命令: tee
```
-a 追加写入操作
-i 忽略中断信号
-p 诊断写入非管道的错误
--help 显示帮助信息
--version 显示版本信息
原文链接:https://www.linuxcool.com/tee
```