基础环境配置
来自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 调整
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:在集群中的每个节点上用来启动 Pod 和容器等。
-
kubectl:用来与集群通信的命令行工具。
- 更新 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
- 下载用于 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
- 添加 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
- 更新 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
一些必要的修改项
- advertiseAddress修改为master的ip地址
- criSocket修改为unix:///var/run/cri-dockerd.sock
- imageRepository修改为私有仓库地址k8s-register.com/google_containers
- kubernetesVersion修改为1.29.2
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
Comments | 0条评论