最新的k8s生产环境部署(k8s1.25+containerd+ubuntu20.04)
最新的k8s生产环境部署,使用k8s1.25、containerd、Ubuntu20.04
1、准备7台机器
主机ip | 主机名 | 说明 |
---|---|---|
192.168.100.128 | k8s-master01 | master节点1 |
192.168.100.129 | k8s-master02 | master节点2 |
192.168.100.130 | k8s-master03 | master节点3 |
192.168.100.131 | k8s-node01 | worker节点1 |
192.168.100.132 | k8s-node02 | worker节点2 |
192.168.100.141 | haproxy01 | ha节点1 |
192.168.100.142 | haproxy02 | ha节点2 |
192.168.100.140 | ha-vip | vip节点 |
2、使用haproxy01、haproxy02服务器,搭建haproxy、keepalived动态代理服务器,实现负载均衡
#修改内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_nonlocal_bind = 1
EOF
#查看内核参数
sysctl -p
#安装配置haproxy
apt update
apt -y install haproxy
# 添加下面行
cat >> /etc/haproxy/haproxy.cfg <<EOF
listen stats
mode http
bind 0.0.0.0:8888
stats enable
log global
stats uri /status
stats auth admin:12345678
listen kubernetes-api-6443
bind 192.168.100.140:6443
mode tcp
server k8s-master01 192.168.100.128:6443 check inter 3s fall 3 rise 3
server k8s-master02 192.168.100.129:6443 check inter 3s fall 3 rise 3
server k8s-master03 192.168.100.130:6443 check inter 3s fall 3 rise 3
EOF
# 重启haproxy
systemctl restart haproxy
3、在haproxy01、haproxy02安装Keepalived
安装keepalived实现HAProxy高可用
apt update
apt -y install keepalived
vim /etc/keepalived/keepalived.conf
#内容如下
globla_defs {
router_id ha1 #在haproxy02上为ha2
}
vrrp_script check_haproxy { #指定脚本
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}
vrrp_instance VI_1 {
state MASTER #在haproxy02上为BACKUP
interface ens32
garp_master_delay 10
smtp_alert
virtual_router_id 66 #指定虚拟路由器ID,haproxy01和haproxy02此值必须相同
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.100.140/24 dev ens32 label ens32:1 #指定VIP,haproxy01和haproxy02此值必须相同
}
track_script {
check_haproxy #调用上面定义的脚本
}
}
# 编写check_haproxy.sh脚本
cat > /etc/keepalived/check_haproxy.sh <<EOF
#!/bin/bash
/usr/bin/killall -0 haproxy || systemctl restart haproxy
EOF
# 修改权限
chmod a+x /etc/keepalived/check_haproxy.sh
# 重启keepalived
systemctl restart keepalived
4、所有主机初始化
4.1 配置ssh key验证
配置ssh key 验证,方便后续同步文件
# 生成密钥
ssh-keygen
# 把密钥发送到其它服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.129
4.2 设置主机名和解析
# 设置主机名
hostnamectl set-hostname k8s-master01
# 修改hosts文件
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.140 ha-vip
192.168.100.128 k8s-master01
192.168.100.129 k8s-master02
192.168.100.130 k8s-master03
192.168.100.131 k8s-node01
192.168.100.132 k8s-node02
192.168.100.141 haproxy01
192.168.100.142 haproxy02
EOF
# 同步配置到其它服务器
for i in {129..132};do scp /etc/hosts 192.168.100.$i:/etc/ ;done
for i in {141..142};do scp /etc/hosts 192.168.100.$i:/etc/ ;done
4.3 禁用swap
# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -i '/swap/s/^/#/' /etc/fstab
4.4 时间同步
# 借助于chronyd服务设定各节点时间精确同步
apt -y install chrony
# 执行同步
chronyc sources -v
4.5 禁用防火墙
# 禁用默认配置的iptables防火墙服务
ufw diable
ufw status
4.6 内核参数调整
如果是安装docker会自动配置以下的内核参数,无需手动实现
如果安装containerd,需要手动配置
允许iptables检查桥接流量,若要显式加载此模块,需运行modprobe br_netfilter
为让linux节点的iptables能够正确查看桥接流量,还需要确认net.bridge.bridge-nf-call-iptables设置为1
# 加载模块
modprobe overlay
modprobe br_netfilter
# 开机加载
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 设置所需的sysctl参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用sysctl参数而不重新启动
sysctl --system
5 所有主机安装Containerd
5.1 包安装Containerd
在所有节点安装Containerd
#Ubuntu20.04利用内置仓库安装containerd
apt update
apt -y install containerd
# 服务启动
systemctl status containerd
# 利用containerd的客户端工具ctr验证修改是否成功
containerd --version
ctr version
# 修改containerd配置,将sanbox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.aliyuncs.com"]
# 配置containerd cgroup驱动程序systemd
# 替换
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
# 查看SystemdCgroup参数
grep SystemdCgroup /etc/containerd/config.toml
# 重启containerd
systemctl restart containerd
5.2 二进制安装Containerd
Containerd有两种二进制安装包:
- containerd-xxx: 不包含runC,需要单独安装runc
- cri-containerd-cni-xxx:包含runC和kubernetes里的所需要的相关文件
5.2.1 下载Containerd
解压到根目录 tar xf cri-containerd-cni-版本号-linux-amd64.tar.gz -C /
5.2.2 配置containerd
# 修改containerd的配置,将sandox_image镜像源设置为阿里云google_containers镜像源
mkdir /etc/containerd/
# 产生containerd默认配置文件
containerd config default > /etc/containerd/config.toml
grep sandbox_image /etc/containerd/config.toml
# 替换
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
# 在此行下面加两行
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.aliyuncs.com"]
systemctl daemon-reload
systemctl status containerd
systemctl enable --now containerd
systemctl is-active containerd
5.2.3 安装CNI插件工具
解决CNI问题
# 下载链接https://github.com/containernetworking/plugins/releases
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
# 覆盖原有文件
tar xf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin
6 所有主机安装kubeadm、kubelet和kubectl
通过国内镜像站点阿里云安装 的参考链接
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
for i in {128..132};do scp /etc/apt/sources.list.d/kubernetes.list 192.168.100.$i:/etc/apt/sources.list.d/;done
apt-get update
#查看版本
apt-cache madison kubeadm|head
#安装指定版本
apt install -y kubeadm=1.25.0-00 kubelet=1.25.0-00 kubectl=1.25.0-00
#安装最新版本
apt install -y kubeadm kubelet kubectl
7 在第一个master节点初始化kubernetes集群
初始化参数说明:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8cLPun1-1664185593468)(D:\software\学习资料\自编文档\imgs\image-20220921122016588.png)]
初始化集群:
# 命令加参数的方式
kubeadm init --control-plane-endpoint="ha-vip" --kubernetes-version=v1.25.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --image-repository registry.aliyuncs.com/google_containers --upload-certs
8 在第一个master节点生成kubectl命令的授权文件
kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权以后才能执行相应的管理操作。kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf
,它可由kubectl通过默认的$home/.kube/config
的路径进行加载。用户也可以在kubectl命令上使用–kubeconfig选项指定一个另的位置。
下面复制认证为kubernetes系统管理员的配置文件到目标用户的家目录下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
9 实现kubectl命令补全
安装bash-completion工具
sudo apt install bash-completion
执行bash_completion
source /usr/share/bash-completion/bash_completion
#在bash shell 中永久的添加自动补全(永久有效,不受切换终端影响)
echo "source <(kubectl completion bash)" >> ~/.bashrc
10 在第一个master节点配置网络组件
kubernetes系统中的pod网络的实现依赖于第三方插件进行,简单易用的是为CoreOS担任的flannel项目。但由于国内无法访问,我们使用calico
在初始化的第一个master节点上运行如下命令,向kubernetes部署calico。
# 默认没有网络插件,显示如下状态
kubectl get nodes
curl https://docs.projectcalico.org/manifests/calico.yaml -O
#修改CIDR
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16" #与初始化集群的--pod-network-cidr=10.244.0.0/16一致
# 指定网卡
- name: CLUSTER_TYPE
value: "k8s,bgp"
# 下面添加
- name: IP_AUTODETECTION_METHOD
value: "interface=ens32" # ens32为本地网卡名字
# 安装
kubectl apply -f calico.yaml
# 再次查看状态
kubectl get nodes
10 将所有worker节点加入kubernetes集群中
kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
--discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b
# 其它主节点加入集群
kubeadm join ha-vip:6443 --token 值 --discovery-token-ca-cert-hash 值 --control-plane --certificate-key 值
如:
kubeadm join ha-vip:6443 --token mmujyx.fb3o1p1lsvit6ubr \
--discovery-token-ca-cert-hash sha256:743c18de023175241bbe5ee8a1903d9c0b32bb01755e29462cece4e4d8276d1b \
--control-plane --certificate-key 368be5b6bd9ebc2644406dadf9fe96e08fc095ef502570223f9d3ef1c7fb1da3
11 Containerd客户端工具
11.1 ctr和crictl
ctr是由containerd提供的一个客户端工具。
crictl是CRI兼容的容器运行时命令接口,和containerd无关,由kubernetes提供,可以使用它来检查和调试k8s节点上的容器运行时和应用程序。
命令 | docker | ctr | crictl |
---|---|---|---|
查看镜像 | docker images | ctr image ls | crictl images |
拉取镜像 | docker pull | ctr image pull | crictl pull |
推送镜像 | docker push | ctr image push | 无 |
删除镜像 | docker rmi | ctr image rm | crictl rmi |
导入镜像 | docker load | ctr image import | 无 |
导出镜像 | docker save | ctr image export | 无 |
修改镜像标签 | docker tag | ctr image tag | 无 |
创建一个新的容器 | docker create | ctr container create | crictl create |
运行一个新的容器 | docker run | ctr run | 无 |
删除容器 | docker rm | ctr container rm | crictl rm |
查看运行容器 | docker ps | ctr task ls / ctr container ls | crictl ps |
启动已有容器 | docker start | ctr task start | crictl start |
关闭已有容器 | docker stop | ctr task kill | crictl stop |
在容器内部执行命令 | docker exec | 无 | crictl exec |
查看容器内信息 | docker inspect | ctr container info | crictl inspect |
查看容器日志 | docker logs | 无 | crictl logs |
查看容器资源 | docker stats | 无 | crictl stats |
11.2 nerdctl
nerdctl是与Docker兼容的CLI for Containerd,其支持compose
nerdctl和docker命令行语法类似
nerdctl发布包含两安装版本:
- Mininal:仅包含nerdctl二进制文件以及rootless模式下的辅助安装脚本
- Full:包含containerd、CNI、runC、BuildKit等完整组件
11.2.1 安装与使用
11.2.1.1 单机使用nerdctl 代替docker
# 在新主机使用nerdctl代替docker
wget https://github.com/containerd/nerdctl/releases/download/v0.23.0/nerdctl-full-0.23.0-linux-amd64.tar.gz
# 查看文件内容
tar tf nerdctl-full-0.23.0-linux-amdj64.tar.gz
# 解压
tar zxvf nerdctl-full-0.23.0-linux-amdj64.tar.gz -C /usr/local
# 启动
systemctl enable --now containerd
# 查看帮助
nerdctl --help
12 token过期
#查看token
kubectl get secret -n kube-system
kubectl get secret -n kube-system bootstrap-token-mmujyx -oyaml
#重新生成token
kubeadm token create --print-join-command
# 请注意,证书密钥可以访问集群敏感数据,请保密!作为保障,上传的证书将在两小时内删除
kubeadm init phase upload-certs --upload-certs
13 Metrics部署和Dashboard部署
13.1 部署Metrics
# 创建目录
mkdir ~/metrics
# 下载metrics配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改文件
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls # 加入参数
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1 # 替换成国内镜像
# 应用
kubectl apply -f components.yaml
13.2 部署Dashboard(推荐使用kuboard)
# 下载安装文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
问题:访问不了raw.githubusercontent.com
解决:1、查询对应ip raw.githubusercontent.com服务器iP raw.githubusercontent.com域名解析 raw.githubusercontent.comiP查询 raw.githubusercontent.com域名iP查询 (ip138.com)
2、修改hosts
185.199.109.133 raw.githubusercontent.com
14 卸载k8s
# 删除所有的k8s节点
kubectl delete node --all
# 重置kubeadm
kubeadm reset
modprode -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.serive
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
apt uninstall kube*
更多推荐
所有评论(0)