WSの小屋

基础环境配置

来自k8s官网:

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。
  • 每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)。
  • CPU 2 核心及以上。
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)。
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里了解更多详细信息。
  • 交换分区的配置。kubelet 的默认行为是在节点上检测到交换内存时无法启动。 kubelet 自 v1.22 起已开始支持交换分区。自 v1.28 起,仅针对 cgroup v2 支持交换分区; kubelet 的 NodeSwap 特性门控处于 Beta 阶段,但默认被禁用。
  • 如果 kubelet 未被正确配置使用交换分区,则你必须禁用交换分区。 例如,sudo swapoff -a 将暂时禁用交换分区。要使此更改在重启后保持不变,请确保在如 /etc/fstab、systemd.swap 等配置文件中禁用交换分区,具体取决于你的系统如何配置。

主机名规划

系统为:ubuntu-22.04.3-live-server-amd64
k8s 版本:1.29.2
harbor 版本:2.10.0
docker 版本: 24.0.5
docker-compose 版本:1.29.2

关于环境操作,如未特殊说明,则需要所有机器都执行
其中 k8s-register 只需要装好 harbor 环境便可(其作用就是一个私有的 docker 仓库)

主机名一定要在hosts中配置好

序号 主机 ip 主机名规划
1 192.168.31.100 k8s-master.com k8s-master
2 192.168.31.101 k8s-node1.com k8s-node1
3 192.168.31.102 k8s-node2.com k8s-node2
4 192.168.31.103 k8s-node3.com k8s-node3
5 192.168.31.200 k8s-register.com k8s-register

ip 设置

编辑文件

bash 复制代码
sudo vim /etc/netplan/00-installer-config.yaml
yaml 复制代码
network:
  ethernets:
    ens33:
      addresses:
        - 192.168.31.100/24
      nameservers:
        addresses: [192.168.31.1, 8.8.8.8]
      routes:
        - to: default
          via: 192.168.31.1
    version: 2
bash 复制代码
# 使生效
sudo netplan apply
# 查看
ip addr show ens33
ip route

设置 hostname

bash 复制代码
hostnamectl set-hostname k8s-master
exec /bin/bash

关闭防火墙

bash 复制代码
sudo systemctl stop ufw
sudo systemctl disable ufw

关闭 swap

bash 复制代码
# 查看swap
swapon -s

# 临时禁用
swapoff -a

# 永久禁用
sed -i 's/.*swap.*/#&/' /etc/fastab

# 内核参数调整
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf

网络参数调整

bash 复制代码
# 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 配置生效
modprobe br_netfilter
modprobe overlay
sysctl -p /etc/sysctl.d/k8s.conf

密钥设置(可选,方便批量操作)

bash 复制代码
# 生成密钥
ssh-keygen -t rsa
# 批量设置密钥
for i in 100 101 102 103 200
do
ssh-copy-id ubuntu@192.168.31.$i
done
# 批量查看hostname
for i in 100 101 102 103 200; do ssh ubuntu@192.168.31.$i "hostname"; done

Docker 环境安装

docker 安装

bash 复制代码
sudo apt update
sudo apt install docker.io # ubuntu apt 特供版,通常版本是比较新的

cgroup driver 调整

cgroup 驱动

kubelet 和底层容器运行时都需要对接控制组来强制执行 为 Pod 和容器管理资源 并为诸如 CPU、内存这类资源设置请求和限制。若要对接控制组,kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。

只需要在/etc/docker/daemon.json中添加以下配置即可

json 复制代码
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

配置镜像仓库

bash 复制代码
sudo vim /etc/docker/daemon.json
json 复制代码
{
  "registry-mirrors": [
    "https://dockerproxy.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.com"
  ],
  // 注意,k8s-register不需要配下面
  // insecure-registries为harbor私有仓库的地址,这里我没启用https,所以加了http前缀
  "insecure-registries": ["http://k8s-register.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
bash 复制代码
sudo systemctl restart docker

cri 环境操作

获取软件

bash 复制代码
# 下载软件
mkdir /data/softs && cd /data/softs
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
# 解压软件
tar xf cir-dockerd-0.3.10.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/
# 检查效果
cri-dockerd --version

定制配置文件

bash 复制代码
sudo vim /lib/systemd/system/cri-dockerd.service
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-dockerd.socket

[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
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

定制配置

bash 复制代码
sudo vim /etc/systemd/system/cri-dockerd.socket
service 复制代码
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-dockerd.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

启动服务

bash 复制代码
sudo systemctl enable --now cri-dockerd cri-dockerd.socket

harbor 仓库操作(只需要 k8s-register 执行)

安装 docker-compose

bash 复制代码
sudo apt install docker-compose

获取软件

bash 复制代码
# 下载软件
mkdir /data/{softs,server} -p && cd /data/softs
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz

# 解压软件
tar -zxvf harbor-offline-installer-v2.10.0tgz -C /data/server/
cd /data/server/harbor/

# 加载镜像
docker load < harbor.v2.10.0.tar.gz
dokcer images

# 备份配置
cp harbor.yml.tmp1 harbor.yml

修改配置

yml 复制代码
# hostname
hostname k8s-register.com
# 注释或配置 https,这里我选择注释https
# 修改登录密码
harbor_admin_password: 123456
# 配置harbor的数据存储目录
data_volume: /data/server/harbor/data
bash 复制代码
# 配置 harbor
sudo ./prepare
# 启动 harbor
sudo ./install.sh
# 检查效果
docker-compose ps

定制服务启动文件

bash 复制代码
sudo vim /etc/systemd/system/harbor.service
service 复制代码
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=https://github.com/goharbor/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
# 需要注意harbor的安装位置
ExecStart=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose --file /data/server/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target
bash 复制代码
# 加载服务配置文件
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start harbor
# 检查状态
sudo systemctl status harbor
# 设置开机自启动
sudo systemctl enable harbor

harbor 仓库定制

浏览器访问域名,用户名:admin,密码:123456

创建一个用户,随后用该用户登录,接着创建一仓库,权限为公开

后续初始化集群需要一个 google_containers 仓库

harbor 仓库测试

为 harbr 仓库提交镜像,必须为镜像打标签,且标签携带 harbor 主机的地址

bash 复制代码
# 登录仓库
# dokcer login k8s-register.com -u wsvaio
Password: # 输入登录密码(上文所创建)
# 下载镜像
dcker pull busybox
# 定制镜像标签 [harbor地址/仓库名/镜像名:版本]
docker tag busybox k8s-register.com/wsvaio/busybox:v0.1
# 推送镜像
docker push k8s-register.com/wsvaio/busybxo:v0.1
# 随后在别的机器上可以拉取到提交的镜像
docker pull k8s-register.com/wsvaio/busybox:v0.1

k8s 集群初始化

安装 kubeadm kubelet kubectl

安装 kubeadm kubelet kubectl

  • kubeadm:用来初始化集群的指令。

  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。

  • kubectl:用来与集群通信的命令行工具。

  1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
bash 复制代码
sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  1. 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略 URL 中的版本:
bash 复制代码
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  1. 添加 Kubernetes apt 仓库
bash 复制代码
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
bash 复制代码
sudo apt-get update
# 列出apt可以安装哪些版本
apt-cache madison kubeadm kubectl kubelet
# 安装指定版本 可以根据需要进行修改
sudo apt-get install kubeadm=1.16.10-00 kubelet=1.16.10-00 kubectl=1.16.10-00
# 锁定版本
sudo apt-mark hold kubelet kubeadm kubectl

确认基本配置

bash 复制代码
# 检查镜像文件列表
sudo kubeadm config images list

# 获取镜像文件 (master操作即可)
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

# 或者手动替换
images=$(kubeadm config images list --kubernetes-version=1.29.2 | awk -F "/" '{print $NF}')
for i in ${images}
do
  sudo docker pull registry.aliyuncs.com/google_containers/$i
  sudo docker tag registry.aliyuncs.com/google_containers/$i k8s-register.com/google_containers/$i
  sudo docker push k8s-register.com/google_containers/$i
  sudo docker rmi registry.aliyuncs.com/google_containers/$i
done

环境初始化

使用命令方式初始化

bash 复制代码
sudo kubeadm init \
  # 指定 k8s 版本
  --kubernetes-version=1.29.2 \
  # master 的 ip 地址,如果是云服务器,则要配置内网的ip地址
  --apiserver-advertise-address=192.168.31.100 \
  # 镜像仓库地址,可指定为私有仓库地址
  --image-repository=k8s-register.com/google_containers \
  # service 的网段
  --service-cidr=10.96.0.0/12 \
  # pod 的网段
  --pod-network-cidr=10.244.0.0/16 \
  # 忽略 Swap 报错
  --ignore-preflight-errors=Swap \
  # 容器引擎
  --cri-socket=unix:///var/run/cri-dockerd.sock

使用资源文件方式初始化

bash 复制代码
# 获取初始化配置
# 使用root用户操作
kubeadm config print init-defaults > /data/k8s/kubeadm-config.yaml 
# 编辑资源文件
sudo vim /data/k8s/kubeadm-config.yaml 

一些必要的修改项

yaml 复制代码
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.31.100 # 修改为master地址
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  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: k8s-register.com/google_containers # 修改为私有仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.29.2 # 修改为1.29.2
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

初始化成功后,会打印一串命令,需要在其它节点中执行(加入集群)
需要额外指定--cri-socket=unix:///var/run/cri-dockerd.sock

bash 复制代码
sudo kubeadm join 192.168.31.100:6443 --token 5l2vqy.1k6z0p3ldy0izgt7 \
        --discovery-token-ca-cert-hash sha256:447cfd04d82d84fa9bcdeb35149d533b0131ef9dd468d2a0a78519dbe9799882 \
        --cri-socket=unix:///var/run/cri-dockerd.sock

随后要想操作集群,需要配置环境

bash 复制代码
sudo mkdir -p /root/.kube
sudo cp -i /etc/kubernetes/admin.conf /root/.kube/config
# 使用kubect
sudo kubectl get nodes

重新生成join token

bash 复制代码
kubeadm token create --print-join-command

命令补全

编辑.bashrc

bash 复制代码
sudo vim ~/.bashrc

在结尾处加上

bashrc 复制代码
source <(kubectl completion bash)
source <(kubeadm completion bash)

加载配置

bash 复制代码
source .bashrc

网络设置

k8s 联网和网络策略
kubectl get nodes 查看到的节点状态都为 NotReady

这里选择flannel

bash 复制代码
sudo mkdir -p /data/k8s/
cd /data/k8s
# 下载
sudo wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
grep image: kube-flannel.yml
# image: docker.io/flannel/flannel:v0.24.2
# image: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1
# 将这两个镜像拉去下来
sudo docker pull flannel/flannel:v0.24.2
sudo docker pull flannel/flannel-cni-plugin:v1.4.0-flannel1
# 改名后推送到harbor私有仓库中
sudo docker tag flannel/flannel:v0.24.2 k8s-register.com/wsvaio/flannel:v0.24.2
sudo docker tag flannel/flannel-cni-plugin:v1.4.0-flannel1 k8s-register.com/wsvaio/flannel-cni-plugin:v1.4.0-flannel1

sudo docker push k8s-register.com/wsvaio/flannel:v0.24.2
sudo docker push k8s-register.com/wsvaio/flannel-cni-plugin:v1.4.0-flannel1

# 随后替换掉kube-flannel.yml中的镜像地址,接着执行
kubectl apply -f kube-flannel.yml
# 检查
kubectl get nodes # 节点状态变为Ready

至此为止,k8s集群环境已经创建完成,可以进行更一步的学习了!

快速搭建脚本

sh 复制代码
# hosts设置
echo '
# 这里修改为你要搭建的主机环境,例如:
192.168.16.71 master1
192.168.16.72 master2
192.168.16.73 master3
' >> /etc/hosts

# 设置主机名
hostnamectl set-hostname 当前主机名
# exec /bin/bash

# 关闭防火墙
systemctl stop ufw
systemctl disable ufw

# swap关闭,网络参数模块调整
echo '
vm.swappiness=0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
' > etc/sysctl.d/k8s.conf

modprobe br_netfilter
modprobe overlay
sysctl -p /etc/sysctl.d/k8s.conf

# 安装docker
apt update
apt install docker.io
echo '
{ "exec-opts": ["native.cgroupdriver=systemd"] }
' > /etc/docker/daemon.json
systemctl restart docker

# cri 环境安装
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
tar xf cir-dockerd-0.3.10.amd64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/
rm -rf cir-dockerd-0.3.10.amd64.tgz
rm -rf cri-dockerd

echo '
[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-dockerd.socket

[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
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
' > /lib/systemd/system/cri-dockerd.service
echo '
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-dockerd.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
' > /etc/systemd/system/cri-dockerd.socket
systemctl enable --now cri-dockerd cri-dockerd.socket

# k8s安装
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install kubeadm=1.29.2-1.1 kubelet=1.29.2-1.1 kubectl=1.29.2-1.1
apt-mark hold kubelet kubeadm kubectl

感谢

马士兵全套Kubernetes(K8S)入门+项目实战,一个视频带你彻底掌握K8S核心能力!

Comments | 0条评论