NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
参考: https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers 容器运行时 https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 使用kubeadm创建集群 https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/ 从私有仓库拉取镜像 https://cloud.tencent.com/developer/article/2308391 常用containerd命令 https://h2c.tech/p/containerd-%E9%85%8D%E7%BD%AE%E7%A7%81%E6%9C%89%E4%BB%93%E5%BA%93/ ## **记得锁定软件版本,避免不小心升级或自动升级** ## **因为在java 容器中配置使用lxcfs,所以要优先安装**`apt install lxcfs` **ubuntu20.04 +k8s1.29+container1.6.x** # 一、服务器优化和更新服务器 cat /etc/sysctl.conf ``` net.core.somaxconn = 40480 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 50000 net.ipv4.tcp_rmem = 4096 4096 160777216 net.ipv4.tcp_wmem = 4096 4096 160777216 net.ipv4.tcp_mem = 786432 2097152 300145728 net.ipv4.tcp_max_syn_backlog = 46384 #syn队列长度,默认1024。可以容纳更多等待连接的网络连接数 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_orphans = 131072 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_timestamps = 0 # net.ipv4.tcp_max_tw_buckets = 10000 # 控制TIME_WAIT套接字最大数量,默认18W net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.netfilter.nf_conntrack_max = 2097152 fs.aio-max-nr = 524288 fs.file-max = 6590202 ``` # 二、安装容器运行时(containerd) ## 2.1、安装和配置先决条件 ``` # 转发 IPv4 并让 iptables 看到桥接流量 执行下述指令: cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter # 设置所需的 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 参数而不重新启动 sudo sysctl --system # 通过运行以下指令确认`br_netfilter`和`overlay`模块被加载: lsmod | grep br_netfilter lsmod | grep overlay # 通过运行以下指令确认 `net.bridge.bridge-nf-call-iptables`、 `net.bridge.bridge-nf-call-ip6tables` `net.ipv4.ip_forward`系统变量在你的`sysctl`配置中被设置为 1: sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward ``` **说明:** 从 v1.22 开始,在使用 kubeadm 创建集群时,如果用户没有在`KubeletConfiguration`下设置`cgroupDriver`字段,kubeadm 默认使用`systemd`。 ## 2.2、源安装containerd ### **Set up Docker's`apt`repository.** ~~~bash # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update ~~~ ### **Install the containerd packages.** ~~~console # List the available versions: $ apt-cache madison docker-ce | awk '{ print $3 }' # 指定版本安装 $ VERSION_STRING=5:24.0.0-1~ubuntu.22.04~jammy $ sudo apt-get install containerd.io ~~~ ## **2.3、配置`systemd`cgroup 驱动** 生成默认containerd配置文件`containerd config default | sudo tee /etc/containerd/config.toml` 结合`runc`使用`systemd`cgroup 驱动,在`/etc/containerd/config.toml`中设置: ~~~ disabled_plugins = [""] #确保没有配置cri [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true ~~~ 如果此配置做了更改需要重启 systemctl daemon-reload sudo systemctl restart containerd ## 2.4、重载沙箱(pause)镜像 在你的[containerd 配置](https://github.com/containerd/containerd/blob/main/docs/cri/config.md)中, 你可以通过设置以下选项重载沙箱镜像: ~~~toml [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.k8s.io/pause:3.2" ~~~ 一旦你更新了这个配置文件,可能就同样需要重启`containerd` # 三、安装 kubeadm、kubelet 和 kubectl 你需要在每台机器上安装以下的软件包: * `kubeadm`:用来初始化集群的指令。 * `kubelet`:在集群中的每个节点上用来启动 Pod 和容器等。 * `kubectl`:用来与集群通信的命令行工具。 **以下指令适用于 Kubernetes 1.29.** 3.1. 更新`apt`包索引并安装使用 Kubernetes`apt`仓库所需要的包: sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gpg 3.2. 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥,因此你可以忽略URL中的版本: # 在低于 Debian 12 和 Ubuntu 22.04 的发行版本中 `/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 3.3. 添加 Kubernetes`apt`仓库。 # 此操作会覆盖 /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 3.4. 更新`apt`包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本: sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl containerd.io # 四、配置 cgroup 驱动程序 **警告:** 你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。 # 五、使用 kubeadm 创建集群 ## 目标 * 安装单个控制平面的 Kubernetes 集群 ## 5.1、初始化控制平面节点 选择一个 Pod 网络插件,并验证是否需要为`kubeadm init`传递参数。 根据你选择的第三方网络插件,你可能需要设置`--pod-network-cidr`的值。 `kubeadm init --pod-network-cidr=10.244.0.0/16` ## 5.2、安装 Pod 网络附加组件 `kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml` 5.3、 kubelet优化 ``` root@saas-test:~/k8s-yaml/crm-sprod# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf /lib/systemd/system/kubelet.service.d/10-kubeadm.conf # Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/default/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --allowed-unsafe-sysctls=kernel.msg*,net.core.somaxconn,net.ipv4.tcp_keepalive_time,net.ipv4.tcp_syncookies,net.ipv4.tcp_tw_reuse,net.ipv4.tcp_timestamps,net.ipv4.tcp_fin_timeout ``` 5.4、k8s 1.24以后 内部使用的域名没有上证书 提示 http server gave http response to https client 所有节点需要修改containerd的配置文件/etc/containerd/config.toml ``` [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.com"] endpoint = ["http://harbor.com"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.80:5000"] endpoint = ["http://192.168.1.80:5000"] ``` ## 配置以后重启了containerd,在pod中使用pull-secret还是没有成功,最后又重启了服务器,结果成功了。不知道哪里有服务还需要重启的。 ## pull-secret 的制作参考从私有仓库拉取镜像