经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
[kubernetes]二进制部署k8s集群-基于containerd
来源:cnblogs  作者:花酒锄作田  时间:2023/8/18 9:28:47  对本文有异议

0. 前言

k8s从1.24版本开始不再直接支持docker,但可以自行调整相关配置,实现1.24版本后的k8s还能调用docker。其实docker自身也是调用containerd,与其k8s通过docker再调用containerd,不如k8s直接调用containerd,以减少性能损耗。

除了containerd,比较流行的容器运行时还有podman,但是podman官方安装文档要么用包管理器在线安装,要么用包管理器下载一堆依赖再编译安装,内网离线环境下安装可能会比较麻烦,而containerd的安装包是静态二进制文件,解压后就能直接使用,离线环境下相对方便一点。

本文将在内网离线环境下用二进制文件部署一个三节点集群+harbor镜像仓库。集群中部署了三个apiserver,并配置nginx反向代理,提升master的高可用性(如对高可用有进一步要求,可以再加个keepalive)。

相关软件信息:

名称 版本 说明
containerd cri-containerd-cni-1.7.2-linux-amd64 容器运行时
harbor 2.8.2 容器镜像仓库
etcd 3.4.24 键值对数据库
kubernetes 1.26.6 容器编排系统
nginx 1.25.1 负载均衡,反向代理apiserver

服务器信息:

IP 操作系统 硬件配置 Hostname 说明
192.168.3.31 Debian 11.6 amd64 4C4G k8s31 nginx+etcd+master+node
192.168.3.32 Debian 11.6 amd64 4C4G k8s32 etcd+master+node
192.168.3.33 Debian 11.6 amd64 4C4G k8s33 etcd+master+node
192.168.3.43 Debian 11.6 amd64 4C4G harbor,内网域名registry.atlas.cn

1. 系统初始化

初始化部分需要三台k8s节点主机都执行, 根据实际情况修改参数。

  1. 修改主机名
  1. # 3.31服务器
  2. hostnamectl set-hostname k8s31
  3. # 3.32服务器
  4. hostnamectl set-hostname k8s32
  5. # 3.33服务器
  6. hostnamectl set-hostname k8s33
  1. 修改/etc/hosts文件,增加以下配置。
  1. 192.168.3.31 k8s31
  2. 192.168.3.32 k8s32
  3. 192.168.3.33 k8s33
  1. 配置时间同步服务
  1. # 1. 安装chrony时间同步应用
  2. apt install -y chrony
  3. # 2. 添加内网的ntp服务器地址。如果在公网,可配置阿里云的ntp服务器地址:ntp.aliyun.com
  4. echo 'server 192.168.3.41 iburst' > /etc/chrony/sources.d/custom-ntp-server.sources
  5. # 3. 启动
  6. systemctl start chrony
  7. # 如果已经启动过了, 可以热加载配置: chronyc reload sources
  1. 关闭swap。如果安装系统时创建了swap,则需要关闭。
  1. swapoff -a
  1. 装载内核模块
  1. # 添加配置
  2. cat << EOF > /etc/modules-load.d/containerd.conf
  3. overlay
  4. br_netfilter
  5. EOF
  6. # 立即装载
  7. modprobe overlay
  8. modprobe br_netfilter
  9. # 检查装载。如果没有输出结果说明没有装载。
  10. lsmod | grep br_netfilter
  1. 配置系统参数
  1. # 1. 添加配置文件
  2. cat << EOF > /etc/sysctl.d/k8s-sysctl.conf
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.bridge.bridge-nf-call-iptables = 1
  5. net.ipv4.ip_forward = 1
  6. user.max_user_namespaces=28633
  7. vm.swappiness = 0
  8. EOF
  9. # 2. 配置生效
  10. sysctl -p /etc/sysctl.d/k8s-sysctl.conf
  1. 启用ipvs。编写system配置文件,实现开机自动装载到内核。
  1. # 1. 安装依赖
  2. apt install -y ipset ipvsadm
  3. # 2. 新建文件并添加配置, 文件路径可任意
  4. tee /root/scripts/k8s.sh <<EOF
  5. modprobe -- ip_vs
  6. modprobe -- ip_vs_rr
  7. modprobe -- ip_vs_wrr
  8. modprobe -- ip_vs_sh
  9. modprobe -- nf_conntrack
  10. EOF
  11. # 3. 新建system文件, 实现开机执行脚本
  12. cat << EOF > /etc/systemd/system/myscripts.service
  13. [Unit]
  14. Description=Run a Custom Script at Startup
  15. After=default.target
  16. [Service]
  17. ExecStart=sh /root/scripts/k8s.sh
  18. [Install]
  19. WantedBy=default.target
  20. EOF
  21. # 4. 加载并启用system
  22. systemctl daemon-reload
  23. systemctl enable myscripts

2. 部署harbor镜像仓库

由于部署集群时候需要先拉取一些镜像,所以harbor在集群外的一个服务器单独部署。官方安装脚本使用了docker,所以harbor节点需要先安装docker,安装步骤可参考 博客园 - linux离线安装docker与compose

harbor的安装步骤可参考 博客园 - centos离线安装harbor,这里大致写一下。

harbor的github release GitHub - goharbor/harbor/releases 提供离线安装包,要先下载好,然后解压。

  1. 创建ssl证书
  1. mkdir certs
  2. # 创建服务器证书密钥文件harbor.key
  3. openssl genrsa -des3 -out harbor.key 2048
  4. # 输入密码,确认密码,自己随便定义,但是要记住,后面会用到。
  5. # 创建服务器证书的申请文件harbor.csr
  6. openssl req -new -key harbor.key -out harbor.csr
  7. # 输入密钥文件的密码, 然后一路回车
  8. # 备份一份服务器密钥文件
  9. cp harbor.key harbor.key.org
  10. # 去除文件口令
  11. openssl rsa -in harbor.key.org -out harbor.key
  12. # 输入密钥文件的密码
  13. # 创建一个自当前日期起为期十年的证书 harbor.crt
  14. openssl x509 -req -days 3650 -in harbor.csr -signkey harbor.key -out harbor.crt
  1. 修改配置文件 harbor.yml,仅列出自修改项。数据存储目录和日志目录自定义了。
  1. hostname: 192.168.3.43
  2. certificate: /home/atlas/apps/harbor/certs/harbor.crt
  3. private_key: /home/atlas/apps/harbor/certs/harbor.key
  4. # admin用户登录密码
  5. harbor_admin_password: Harbor2023
  6. # 数据卷目录
  7. data_volume: /home/atlas/apps/harbor/data
  8. # 日志目录
  9. location: /home/atlas/apps/harbor/logs/
  1. 执行安装脚本
  1. ./install.sh
  1. 浏览器访问 https://192.168.3.43 ,测试能否正常登录访问harbor。

3. 安装containerd

  1. 从GitHub https://github.com/containerd/containerd/releases 下载二进制包
  2. 解压压缩包
  1. tar xf cri-containerd-cni-1.7.2-linux-amd64.tar.gz -C /
  1. 生成 containerd 配置文件
  1. mkdir /etc/containerd
  2. containerd config default > /etc/containerd/config.toml
  1. 编辑 /etc/containerd/config.toml ,修改以下内容
  1. # 修改数据存储目录
  2. root = "/home/apps/containerd"
  3. # 对于使用systemd作为init system的linux发行版,官方建议用systemd作为容器cgroup driver
  4. # false改成true
  5. SystemdCgroup = true
  6. # 修改pause镜像下载地址,这里用的是内网域名地址
  7. sandbox_image = "registry.atlas.cn/public/pause:3.9"
  8. # 私有harbor的连接信息
  9. [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.atlas.cn"]
  10. [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.atlas.cn".tls]
  11. insecure_skip_verify = true
  12. [plugins."io.containerd.grpc.v1.cri".registry.configs."registry.atlas.cn".auth]
  13. username = "admin"
  14. password = "Harbor2023"
  1. 重加载systemd配置,启动containerd
  1. systemctl daemon-reload
  2. systemctl start containerd

4. 生成ca证书

后面的k8s和etcd集群都会用到ca证书。如果组织能提供统一的CA认证中心,则直接使用组织颁发的CA证书即可。如果没有统一的CA认证中心,则可以通过颁发自签名的CA证书来完成安全配置。这里自行生成一个ca证书。

  1. # 生成私钥文件ca.key
  2. openssl genrsa -out ca.key 2048
  3. # 根据私钥文件生成根证书文件ca.crt
  4. # /CN为master的主机名或IP地址
  5. # days为证书的有效期
  6. openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.3.31" -days 36500 -out ca.crt
  7. # 拷贝ca证书到/etc/kubernetes/pki
  8. mkdir -p /etc/kubernetes/pki
  9. cp ca.crt ca.key /etc/kubernetes/pki/

5. 部署etcd集群

部署一个三节点etcd集群,集群间使用https协议加密通信。etcd的安装包可以从官网下载,下载后解压,将压缩包中的etcdetcdctl放到/usr/local/bin目录。

  1. 编辑文件etcd_ssl.cnf。IP地址为etcd节点。
  1. [ req ]
  2. req_extensions = v3_req
  3. distinguished_name = req_distinguished_name
  4. [ req_distinguished_name ]
  5. [ v3_req ]
  6. basicConstraints = CA:FALSE
  7. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  8. subjectAltName = @alt_names
  9. [ alt_names ]
  10. IP.1 = 192.168.3.31
  11. IP.2 = 192.168.3.32
  12. IP.3 = 192.168.3.33
  1. 创建etcd服务端证书
  1. openssl genrsa -out etcd_server.key 2048
  2. openssl req -new -key etcd_server.key -config etcd_ssl.cnf -subj "/CN=etcd-server" -out etcd_server.csr
  3. openssl x509 -req -in etcd_server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_server.crt
  1. 创建etcd客户端证书
  1. openssl genrsa -out etcd_client.key 2048
  2. openssl req -new -key etcd_client.key -config etcd_ssl.cnf -subj "/CN=etcd-client" -out etcd_client.csr
  3. openssl x509 -req -in etcd_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_client.crt
  1. 编辑etcd的配置文件。注意,各节点的ETCD_NAME和监听地址不一样,ip和证书文件路径要根据实际来修改。以下示例为192.168.3.31的etcd配置
  1. ETCD_NAME=etcd1
  2. ETCD_DATA_DIR=/home/atlas/apps/etcd/data
  3. ETCD_CERT_FILE=/home/atlas/apps/etcd/certs/etcd_server.crt
  4. ETCD_KEY_FILE=/home/atlas/apps/etcd/certs/etcd_server.key
  5. ETCD_TRUSTED_CA_FILE=/home/atlas/apps/kubernetes/certs/ca.crt
  6. ETCD_CLIENT_CERT_AUTH=true
  7. ETCD_LISTEN_CLIENT_URLS=https://192.168.3.31:2379
  8. ETCD_ADVERTISE_CLIENT_URLS=https://192.168.3.31:2379
  9. ETCD_PEER_CERT_FILE=/home/atlas/apps/etcd/certs/etcd_server.crt
  10. ETCD_PEER_KEY_FILE=/home/atlas/apps/etcd/certs/etcd_server.key
  11. ETCD_PEER_TRUSTED_CA_FILE=/home/atlas/apps/kubernetes/certs/ca.crt
  12. ETCD_LISTEN_PEER_URLS=https://192.168.3.31:2380
  13. ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.3.31:2380
  14. ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
  15. ETCD_INITIAL_CLUSTER="etcd1=https://192.168.3.31:2380,etcd2=https://192.168.3.32:2380,etcd3=https://192.168.3.33:2380"
  16. ETCD_INITIAL_CLUSTER_STATE=new
  1. 编辑/etc/systemd/system/etcd.service,注意根据实际修改配置文件和etcd二进制文件的路径
  1. [Unit]
  2. Description=etcd key-value store
  3. Documentation=https://github.com/etcd-io/etcd
  4. After=network.target
  5. [Service]
  6. EnvironmentFile=/home/atlas/apps/etcd/conf/etcd.conf
  7. ExecStart=/usr/local/bin/etcd
  8. Restart=always
  9. [Install]
  10. WantedBy=multi-user.target
  1. 加载systemd配置,启动etcd
  1. systemctl daemon-reload
  2. systemctl start etcd
  1. 验证集群是否部署成功。注意根据实际修改证书文件路径和etcd节点的IP与端口
  1. etcdctl --cacert=/etc/kubernetes/pki/ca.crt --cert=/home/atlas/apps/etcd/certs/etcd_client.crt --key=/home/atlas/apps/etcd/certs/etcd_client.key --endpoints=https://192.168.3.31:2379,https://192.168.3.32:2379,https://192.168.3.33:2379 endpoint health

如果集群部署成功,应该有如下类似输出

  1. https://192.168.3.33:2379 is healthy: successfully committed proposal: took = 27.841376ms
  2. https://192.168.3.32:2379 is healthy: successfully committed proposal: took = 29.489289ms
  3. https://192.168.3.31:2379 is healthy: successfully committed proposal: took = 35.703538ms

6. 部署k8s

k8s的二进制文件安装包可以从github下载:https://github.com/kubernetes/kubernetes/releases

在changelog中找到二进制包的下载链接,下载server binary即可,里面包含了master和node的二进制文件。

解压后将其中的二进制文件挪到 /usr/local/bin

6.1 安装apiserver

  1. 编辑master_ssl.cnf。DNS.5 ~ DNS.7为三台服务器的主机名,另行设置/etc/hosts。IP.1为Master Service虚拟服务的Cluster IP地址,IP.2 ~ IP.4为apiserver的服务器IP
  1. [req]
  2. req_extensions = v3_req
  3. distinguished_name = req_distinguished_name
  4. [req_distinguished_name]
  5. [ v3_req ]
  6. basicConstraints = CA:FALSE
  7. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  8. subjectAltName = @alt_names
  9. [alt_names]
  10. DNS.1 = kubernetes
  11. DNS.2 = kubernetes.default
  12. DNS.3 = kubernetes.default.svc
  13. DNS.4 = kubernetes.default.svc.cluster.local
  14. DNS.5 = k8s31
  15. DNS.6 = k8s32
  16. DNS.7 = k8s33
  17. IP.1 = 169.169.0.1
  18. IP.2 = 192.168.3.31
  19. IP.3 = 192.168.3.32
  20. IP.4 = 192.168.3.33
  1. 生成证书文件
  1. openssl genrsa -out apiserver.key 2048
  2. openssl req -new -key apiserver.key -config master_ssl.cnf -subj "/CN=192.168.3.31" -out apiserver.csr
  3. # ca.crt和ca.key是 "2. openssl生成证书"中的两个证书文件
  4. openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile master_ssl.cnf -out apiserver.crt
  1. 使用cfssl创建sa.pub和sa-key.pem。cfssl和cfssljson可以从github下载
  1. cat<<EOF > sa-csr.json
  2. {
  3. "CN":"sa",
  4. "key":{
  5. "algo":"rsa",
  6. "size":2048
  7. },
  8. "names":[
  9. {
  10. "C":"CN",
  11. "L":"BeiJing",
  12. "ST":"BeiJing",
  13. "O":"k8s",
  14. "OU":"System"
  15. }
  16. ]
  17. }
  18. EOF
  19. # cfssl和cfssljson可自行在GitHub搜索下载
  20. cfssl gencert -initca sa-csr.json | cfssljson -bare sa -
  21. openssl x509 -in sa.pem -pubkey -noout > sa.pub
  1. 编辑kube-apiserver的配置文件,注意根据实际情况修改文件路径和etcd地址
  1. KUBE_API_ARGS="--secure-port=6443 --tls-cert-file=/home/atlas/apps/kubernetes/apiserver/certs/apiserver.crt --tls-private-key-file=/home/atlas/apps/kubernetes/apiserver/certs/apiserver.key --client-ca-file=/home/atlas/apps/kubernetes/certs/ca.crt --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/home/atlas/apps/kubernetes/certs/sa.pub --service-account-signing-key-file=/home/atlas/apps/kubernetes/certs/sa-key.pem --apiserver-count=3 --endpoint-reconciler-type=master-count --etcd-servers=https://192.168.3.31:2379,https://192.168.3.32:2379,https://192.168.3.33:2379 --etcd-cafile=/home/atlas/apps/kubernetes/certs/ca.crt --etcd-certfile=/home/atlas/apps/etcd/certs/etcd_client.crt --etcd-keyfile=/home/atlas/apps/etcd/certs/etcd_client.key --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=30000-32767 --allow-privileged=true --audit-log-maxsize=100 --audit-log-maxage=15 --audit-log-path=/home/atlas/apps/kubernetes/apiserver/logs/apiserver.log --v=2"
  1. 编辑service文件。/etc/systemd/system/kube-apiserver.service
  1. [Unit]
  2. Description=Kubernetes API Server
  3. Documentation=https://github.com/kubernetes/kubernetes
  4. [Service]
  5. EnvironmentFile=/home/atlas/apps/kubernetes/apiserver/conf/apiserver
  6. ExecStart=/usr/local/bin/kube-apiserver $KUBE_API_ARGS
  7. Restart=always
  8. [Install]
  9. WantedBy=multi-user.target
  1. 加载service文件,启动kube-apiserver
  1. systemctl daemon-reload
  2. systemctl start kube-apiserver
  1. 生成客户端证书
  1. openssl genrsa -out client.key 2048
  2. # /CN的名称用于标识连接apiserver的客户端用户名称
  3. openssl req -new -key client.key -subj "/CN=admin" -out client.csr
  4. openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500
  1. 创建客户端连接apiserver所需的kubeconfig配置文件。其中server为nginx监听地址。注意根据实际修改配置
  1. apiVersion: v1
  2. kind: Config
  3. clusters:
  4. - name: default
  5. cluster:
  6. server: https://192.168.3.31:9443
  7. certificate-authority: /home/atlas/apps/kubernetes/certs/ca.crt
  8. users:
  9. - name: admin
  10. user:
  11. client-certificate: /home/atlas/apps/kubernetes/apiserver/certs/client.crt
  12. client-key: /home/atlas/apps/kubernetes/apiserver/certs/client.key
  13. contexts:
  14. - context:
  15. cluster: default
  16. user: admin
  17. name: default
  18. current-context: default

6.2 安装kube-controller-manager

  1. 编辑配置文件 /home/atlas/apps/kubernetes/controller-manager/conf/env
  1. KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig --leader-elect=true --service-cluster-ip-range=169.169.0.0/16 --service-account-private-key-file=/home/atlas/apps/kubernetes/apiserver/certs/apiserver.key --root-ca-file=/home/atlas/apps/kubernetes/certs/ca.crt --v=0"
  1. 编辑service文件/etc/systemd/system/kube-controller-manager.service
  1. [Unit]
  2. Description=Kubernetes Controller Manager
  3. Documentation=https://github.com/kubernetes/kubernetes
  4. [Service]
  5. EnvironmentFile=/home/atlas/apps/kubernetes/controller-manager/conf/env
  6. ExecStart=/usr/local/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
  7. Restart=always
  8. [Install]
  9. WantedBy=multi-user.target
  1. 加载配置文件并启动
  1. systemctl daemon-reload
  2. systemctl start kube-controller-manager

6.3 安装kube-scheduler

  1. 编辑配置文件
  1. KUBE_SCHEDULER_ARGS="--kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig --leader-elect=true --v=0"
  1. 编辑service文件 /etc/systemd/system/kube-scheduler.service
  1. [Unit]
  2. Description=Kubernetes Scheduler
  3. Documentation=https://github.com/kubernetes/kubernetes
  4. [Service]
  5. EnvironmentFile=//home/atlas/apps/kubernetes/scheduler/conf/env
  6. ExecStart=/usr/local/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
  7. Restart=always
  8. [Install]
  9. WantedBy=multi-user.target
  1. 启动
  1. systemctl daemon-reload
  2. systemctl start kube-scheduler

6.4 安装nginx

这里用nginx对apiserver进行tcp反向代理,也可以使用haproxy。nginx编译安装可参考 博客园 - linux编译安装nginx,docker安装nginx更加简单,本文略过。以下为示例配置:

  1. worker_processes auto;
  2. #error_log logs/error.log;
  3. #error_log logs/error.log notice;
  4. #error_log logs/error.log info;
  5. #pid logs/nginx.pid;
  6. events {
  7. worker_connections 65536;
  8. }
  9. stream{
  10. log_format json2 '$remote_addr [$time_local] '
  11. '$protocol $status $bytes_sent $bytes_received '
  12. '$session_time "$upstream_addr" '
  13. '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
  14. access_log logs/stream.log json2;
  15. upstream apiservers {
  16. server 192.168.3.31:6443;
  17. server 192.168.3.32:6443;
  18. server 192.168.3.33:6443;
  19. }
  20. server {
  21. listen 9443;
  22. proxy_pass apiservers;
  23. }
  24. }

6.5 安装kubelet

  1. 编辑文件 /home/atlas/apps/kubernetes/kubelet/conf/env。注意修改hostname-override中的IP为Node节点自己的IP。如果修改了containerd的socket地址,则配置中也要按实际修改。
  1. KUBELET_ARGS="--kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig --config=/home/atlas/apps/kubernetes/kubelet/conf/kubelet.config --hostname-override=192.168.3.31 --v=0 --container-runtime-endpoint="unix:///run/containerd/containerd.sock"

主要参数说明

参数 说明
--kubeconfig 设置与 apiserver 连接的配置,可以与 controller-manager 的 kubeconfig 相同。新的Node节点注意拷贝客户端相关证书文件,比如ca.crt, client.key, client.crt
--config kubelet 配置文件,设置可以让多个Node共享的配置参数。
--hostname-override 本Node在集群中的名称,默认值为主机名
--network-plugin 网络插件类型,推荐使用CNI网络插件
  1. 编辑文件 /home/atlas/apps/kubernetes/kubelet/conf/kubelet.config
  1. kind: KubeletConfiguration
  2. apiVersion: kubelet.config.k8s.io/v1beta1
  3. address: 0.0.0.0
  4. port: 10250
  5. cgroupDriver: systemd
  6. clusterDNS: ["169.169.0.100"]
  7. clusterDomain: cluster.local
  8. authentication:
  9. anonymous:
  10. enabled: true

主要参数说明

参数 说明
address 服务监听IP地址
port 服务监听端口号,默认值为10250
cgroupDriver cgroupDriver驱动,默认值为cgroupfs,可选 systemd
clusterDNS 集群DNS服务的IP地址
clusterDomain 服务DNS域名后缀
authentication 是否允许匿名访问或者是否使用webhook鉴权
  1. 编辑service文件 /etc/systemd/system/kubelet.service
  1. [Unit]
  2. Description=Kubernetes Kubelet Server
  3. Documentation=https://github.com/kubernetes/kubernetes
  4. After=docker.target
  5. [Service]
  6. EnvironmentFile=/home/atlas/apps/kubernetes/kubelet/conf/env
  7. ExecStart=/usr/local/bin/kubelet $KUBELET_ARGS
  8. Restart=always
  9. [Install]
  10. WantedBy=multi-user.target
  1. 加载service并启动kubelet
  1. systemctl daemon-reload && systemctl start kubelet

6.6 安装kube-proxy

  1. 编辑文件 /home/atlas/apps/kubernetes/proxy/conf/env。注意修改hostname-override中的IP为Node节点自己的IP。
  1. KUBE_PROXY_ARGS="--kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig --hostname-override=192.168.3.31 --proxy-mode=ipvs --v=0"
  1. 编辑service文件 /etc/systemd/system/kube-proxy.service
  1. [Unit]
  2. Description=Kubernetes Kube-Proxy Server
  3. Documentation=https://github.com/kubernetes/kubernetes
  4. After=network.target
  5. [Service]
  6. EnvironmentFile=/home/atlas/apps/kubernetes/proxy/conf/env
  7. ExecStart=/usr/local/bin/kube-proxy $KUBE_PROXY_ARGS
  8. Restart=always
  9. [Install]
  10. WantedBy=multi-user.target
  1. 加载service并启动
  1. systemctl daemon-reload && systemctl start kube-proxy

6.7 安装calico

  1. 在master节点通过kubectl查询自动注册到 k8s 的 node 信息。由于 Master 开启了 https 认证,所以 kubectl 也需要使用客户端 CA证书连接Master,可以直接使用 apiserver 的 kubeconfig 文件。
  1. kubectl --kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig get nodes

若是不想每次敲命令都要指定kubeconfig文件,可以编辑~/.bashrc,增加如下内容后source ~/.bashrc

  1. alias kubectl='/usr/local/bin/kubectl --kubeconfig=/home/atlas/apps/kubernetes/apiserver/conf/kubeconfig'

如果操作步骤和以上保持一致,命令执行应有类似如下输出。

  1. NAME STATUS ROLES AGE VERSION
  2. 192.168.3.31 Ready <none> 18m v1.26.6
  3. 192.168.3.32 Ready <none> 16m v1.26.6
  4. 192.168.3.33 Ready <none> 16m v1.26.6

由于安装containerd时,安装包里已经包含了cni插件,所以节点状态都是ready。自测节点之间通信还是有问题,所以换成相对来说熟悉点的calico。

  1. 下载calico文件。
  1. wget https://docs.projectcalico.org/manifests/calico.yaml
  1. 编辑calico.yaml文件。因为内网离线部署,以提前在公网下载好calico的镜像并推送到内网的harbor镜像仓库,所以配置文件中的镜像修改成了内网的镜像。
  1. image: registry.atlas.cn/calico/cni:v3.26.1
  2. image: registry.atlas.cn/calico/node:v3.26.1
  3. image: registry.atlas.cn/calico/kube-controllers:v3.26.1
  1. 部署calico。PS:此处的kubectl命令以alias kubeconfig
  1. kubectl apply -f calico.yaml
  1. 查看calico的pod是否正常运行。如果正常,状态应该都是running;若不正常,则需要describe pod的信息查看什么问题
  1. kubectl get pods -A

6.8 集群内安装CoreDNS

  1. 编辑部署文件 coredns.yaml。其中corefile里面的forward地址是内网的dns服务器地址,若内网没有dns,可修改为/etc/resolv.conf。coredns的镜像地址也是提前推送的harbor的镜像。
  1. ---
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: coredns
  6. namespace: kube-system
  7. labels:
  8. addonmanager.kubernetes.io/mode: EnsureExists
  9. data:
  10. Corefile: |
  11. cluster.local {
  12. errors
  13. health {
  14. lameduck 5s
  15. }
  16. ready
  17. kubernetes cluster.local 169.169.0.0/16 {
  18. fallthrough in-addr.arpa ip6.arpa
  19. }
  20. prometheus :9153
  21. forward . 192.168.3.41
  22. cache 30
  23. loop
  24. reload
  25. loadbalance
  26. }
  27. . {
  28. cache 30
  29. loadbalance
  30. forward . 192.168.3.41
  31. }
  32. ---
  33. apiVersion: apps/v1
  34. kind: Deployment
  35. metadata:
  36. name: coredns
  37. namespace: kube-system
  38. labels:
  39. k8s-app: kube-dns
  40. kubernetes.io/name: "CoreDNS"
  41. spec:
  42. replicas: 1
  43. strategy:
  44. type: RollingUpdate
  45. rollingUpdate:
  46. maxUnavailable: 1
  47. selector:
  48. matchLabels:
  49. k8s-app: kube-dns
  50. template:
  51. metadata:
  52. labels:
  53. k8s-app: kube-dns
  54. spec:
  55. priorityClassName: system-cluster-critical
  56. tolerations:
  57. - key: "CriticalAddonsOnly"
  58. operator: "Exists"
  59. nodeSelector:
  60. kubernetes.io/os: linux
  61. affinity:
  62. podAntiAffinity:
  63. preferredDuringSchedulingIgnoredDuringExecution:
  64. - weight: 100
  65. podAffinityTerm:
  66. labelSelector:
  67. matchExpressions:
  68. - key: k8s-app
  69. operator: In
  70. values: ["kube-dns"]
  71. topologyKey: kubernetes.io/hostname
  72. imagePullSecrets:
  73. - name: registry-harbor
  74. containers:
  75. - name: coredns
  76. image: registry.atlas.cn/public/coredns:1.11.1
  77. imagePullPolicy: IfNotPresent
  78. resources:
  79. limits:
  80. memory: 170Mi
  81. requests:
  82. cpu: 100m
  83. memory: 70Mi
  84. args: [ "-conf", "/etc/coredns/Corefile" ]
  85. volumeMounts:
  86. - name: config-volume
  87. mountPath: /etc/coredns
  88. readOnly: true
  89. ports:
  90. - containerPort: 53
  91. name: dns
  92. protocol: UDP
  93. - containerPort: 53
  94. name: dns-tcp
  95. protocol: TCP
  96. - containerPort: 9153
  97. name: metrics
  98. protocol: TCP
  99. securityContext:
  100. allowPrivilegeEscalation: false
  101. capabilities:
  102. add:
  103. - NET_BIND_SERVICE
  104. drop:
  105. - all
  106. readOnlyRootFilesystem: true
  107. livenessProbe:
  108. httpGet:
  109. path: /health
  110. port: 8080
  111. scheme: HTTP
  112. initialDelaySeconds: 60
  113. timeoutSeconds: 5
  114. successThreshold: 1
  115. failureThreshold: 5
  116. readinessProbe:
  117. httpGet:
  118. path: /ready
  119. port: 8181
  120. scheme: HTTP
  121. dnsPolicy: Default
  122. volumes:
  123. - name: config-volume
  124. configMap:
  125. name: coredns
  126. items:
  127. - key: Corefile
  128. path: Corefile
  129. ---
  130. apiVersion: v1
  131. kind: Service
  132. metadata:
  133. name: kube-dns
  134. namespace: kube-system
  135. annotations:
  136. prometheus.io/port: "9153"
  137. prometheus.io/scrape: "true"
  138. labels:
  139. k8s-app: kube-dns
  140. kubernetes.io/cluster-service: "true"
  141. kubernetes.io/name: "CoreDNS"
  142. spec:
  143. selector:
  144. k8s-app: kube-dns
  145. clusterIP: 169.169.0.100
  146. ports:
  147. - name: dns
  148. port: 53
  149. protocol: UDP
  150. - name: dns-tcp
  151. port: 53
  152. protocol: TCP
  153. - name: metrics
  154. port: 9153
  155. protocol: TCP
  1. 部署一个nginx用于测试。注意按实际修改镜像地址
  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: deploy-nginx
  6. spec:
  7. replicas: 2
  8. selector:
  9. matchLabels:
  10. app: nginx
  11. env: dev
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. env: dev
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: registry.atlas.cn/public/nginx:1.25.1
  21. ports:
  22. - containerPort: 80
  23. ---
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27. name: svc-nginx
  28. spec:
  29. ports:
  30. - protocol: TCP
  31. port: 80
  32. targetPort: 80
  33. selector:
  34. app: nginx
  35. env: dev

发布nginx服务

  1. kubectl create -f nginx.yaml
  1. 运行一个ubuntu的pod。镜像基于原版的ubuntu:22.04修改,提前安装了dnsutils再封装推送到内网harbor,Dockerfile内容如下:
  1. FROM ubuntu:22.04
  2. RUN apt update -y && apt install -y dnsutils iputils-ping curl
  3. RUN apt clean && rm -rf /var/lib/apt/lists/*

使用文件声明pod。注意按实际修改镜像地址

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: ubuntu
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: ubuntu
  9. image: registry.atlas.cn/public/ubuntu:22.04.1
  10. command:
  11. - tail
  12. - -f
  13. - /dev/null

发布pod

  1. kubectl create -f ubuntu.yaml

使用exec选项进入pod内

  1. kubectl exec -it ubuntu -- bash

在pod内测试能否连通nginx。若一切响应正常,说明集群已基本搭建成功

  1. # 测试能否解析出svc-nginx的ip
  2. nslookup svc-nginx
  3. # 测试能否调通svc-nginx:80
  4. curl http://svc-nginx

补充

以上步骤只是部署了一个能正常发布服务的基础k8s集群,生产环境中还要考虑存储、网络、安全等问题,相关内容比较多,本文不再赘述,可参考其它文档。

问题记录

sysctl加载配置时报错

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

处理:装载内核模块

  1. modprobe br_netfilter

参考

原文链接:https://www.cnblogs.com/XY-Heruo/p/17638634.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号