容器安装指南
本文档提供了在 Linux 系统上安装和配置容器运行时环境的步骤,包括网络配置、containerd 和 runc 的安装,以及 Kubernetes 集群的初始化和配置。
网络配置
首先加载必要的内核模块,并设置网络参数以符合 Kubernetes 的网络要求。
# 加载必要的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置网络参数,确保它们在重启后依然有效
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
# 立即应用网络参数设置
sudo sysctl --system
# 检查模块是否加载成功
lsmod | grep br_netfilter
lsmod | grep overlay
# 显示当前的网络参数设置
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
初始化系统
确保 IP 转发被启用,这对于网络功能是必要的。
# 编辑 sysctl 配置以启用 IP 转发
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
# 应用配置
sudo sysctl -p
安装 containerd
从 GitHub 下载并安装 containerd,包括配置其服务和参数。
# 下载 containerd
wget https://github.com/containerd/containerd/releases/download/v1.6.31/containerd-1.6.31-linux-amd64.tar.gz
# 解压到指定目录
tar -C /usr/local -xzvf containerd-1.6.31-linux-amd64.tar.gz
# 下载 systemd 服务文件
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
cp containerd.service /etc/systemd/system/containerd.service
# 编辑 containerd 的启动命令
vi /etc/systemd/system/containerd.service
ExecStart=/usr/local/bin/containerd --config=/etc/containerd/config.toml
# 修改下 limit
[Service]
LimitNOFILE=1048576
# 修改时区 +8
Environment=TZ=Asia/Shanghai
# 生成默认的 containerd 配置文件并进行个性化配置
containerd config default > config.toml
# 配置文件内容见下方
vi /etc/containerd/config.toml
# 创建配置目录并移动配置文件
mkdir /etc/containerd/
cp config.toml /etc/containerd/config.toml
$ cat /etc/containerd/config.toml
# 这是 containerd 的主配置文件
# root 是 containerd 存储其状态的目录
root = "/var/lib/containerd"
# state 是 containerd 存储运行状态的目录
state = "/run/containerd"
# containerd 的日志设置
[debug]
# 开启详细调试日志
level = "info"
# gRPC 服务配置
[grpc]
# gRPC 服务监听地址
address = "/var/run/containerd/containerd.sock"
# gRPC 服务的 TCP 监听地址,留空表示不启用 TCP
tcp_address = ""
# gRPC 服务的 TLS 证书文件路径
tcp_tls_cert = ""
# gRPC 服务的 TLS 密钥文件路径
tcp_tls_key = ""
# gRPC 服务的 TLS CA 证书文件路径
tcp_tls_ca = ""
# CRI 插件配置,用于 Kubernetes 集成
[plugins."io.containerd.grpc.v1.cri"]
# 启用 CRI 插件
sandbox_image = "k8s.gcr.io/pause:3.1"
# 容器网络配置
[plugins."io.containerd.grpc.v1.cri".cni]
# CNI 配置文件的目录
conf_dir = "/etc/cni/net.d"
# CNI 插件的目录
bin_dir = "/opt/cni/bin"
# 容器运行时配置
[plugins."io.containerd.grpc.v1.cri".containerd]
# 默认使用 runc 作为容器运行时
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
# 配置 limit
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.linux]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options.linux.rlimits]
type = "nofile"
hard = 1048576
soft = 1048576
# 快照插件配置,使用 overlayfs 作为快照驱动
[plugins."io.containerd.snapshotter.v1.overlayfs"]
# 快照的存储路径
# root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"
root_path = "/data/containerd/overlayfs"
# Metrics 统计信息的配置
[metrics]
# Metrics 服务监听地址
address = "127.0.0.1:1337"
# 超时设置
[timeouts]
# 连接超时时间
"io.containerd.timeout.shim.cleanup" = "5m"
"io.containerd.timeout.shim.load" = "5m"
"io.containerd.timeout.shim.shutdown" = "3m"
"io.containerd.timeout.task.state" = "2s"
# 重新加载 systemd 管理器配置,启用并启动 containerd
systemctl daemon-reload
systemctl enable --now containerd
安装 runc
从 GitHub 下载并安装 runc。
# 下载 runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
# 安装 runc
install -m 755 runc.amd64 /usr/local/sbin/runc
安装 CNI 插件
下载并安装 CNI 插件,这对于 Kubernetes 中的网络功能是必要的。
# 下载 CNI 插件
wget https://github.com/containernetworking/plugins/releases/download/v1.4.1/cni-plugins-linux-amd64-v1.4.1.tgz
# 解压到指定目录
mkdir -p /opt/cni/bin
tar -C /opt/cni/bin -xzvf cni-plugins-linux-amd64-v1.4.1.tgz
最后,重启 containerd 服务并检查状态:
sudo systemctl restart containerd && sudo systemctl status containerd -l
Kubernetes 安装
安装工具
配置 Kubernetes 的 YUM 仓库,并安装 kubelet、kubeadm 和 kubectl。
# 配置 Kubernetes YUM 仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/# Kubernetes 安装与集群初始化
本文档介绍如何在 Linux 系统上安装和配置 Kubernetes 集群,包括必要的工具和组件安装以及集群的初始化配置。
## 安装工具
配置 Kubernetes 的 YUM 仓库,并安装 kubelet、kubeadm 和 kubectl。
```bash
# 配置 Kubernetes YUM 仓库
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# 安装 kubelet, kubeadm, kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启用并启动 kubelet 服务
sudo systemctl enable --now kubelet
集群初始化
创建一个配置文件并进行初始化。
# 创建一个目录用于存放安装文件
mkdir k8sInstall
cd k8sInstall/
# 生成默认的初始化配置文件
kubeadm config print init-defaults > init.yml
# 修改 init.yml 文件,设置以下参数:
apiserver-advertise-address
ttl
token
dataDir
name
taints
## 添加管理配置:
controllerManager:
extraArgs:
allocate-node-cidrs: "true" # 启用节点 CIDR 分配
cluster-cidr: "10.244.0.0/16" # 设置集群 CIDR 范围
执行集群初始化
# 使用配置文件初始化集群
kubeadm init --config ./init.yml
初始化输出信息
初始化成功后,将显示如下信息:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.16.201.18:6443 --token wjj212.wwwwasdqwe121231 \
--discovery-token-ca-cert-hash sha256:2665954b615b46a2ef9aa742d6c34dfeda66240f053f28fc7588663318febde4
配置 Kubernetes 管理器
获取节点的 pod CIDR 范围:
# 获取指定节点的 pod CIDR 范围
$ kubectl get node vm172-16-201-18 -o jsonpath='{.spec.podCIDR}'
10.244.0.0/24
安装 flannel 网络插件
安装 flannel 来管理集群内部的网络。
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
安装完成后的状态
检查命名空间和资源的状态:
$ kubectl get ns
NAME STATUS AGE
default Active 101s
kube-flannel Active 8s
kube-node-lease Active 101s
kube-public Active 101s
kube-system Active 101s
其他节点加入集群
其他节点加入集群的步骤,无需重新安装 flannel:
# 查看集群节点状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
vm172-16-201-18 Ready control-plane 12h v1.29.3
vm172-16-201-193 Ready <none> 12h v1.29.3
vm172-16-201-226 Ready <none> 11h v1.29.3
去掉主节点的污点,让 pod 可以迁移到这个节点上:
kubectl taint nodes vm172-16-201-18 node-role.kubernetes.io/master:NoSchedule-