kubernetes-集群部署

k8s部署-集群部署

步骤简述

  1. os基础环境准备
  2. etcd, containerd, 二进制准备等, kubeadm
  3. master节点初始化, work节点join集群
  4. 安装网络插件
  5. 安装其它非核心组件

os环境准备

  1. 时间保持一致
  2. 共同的dns服务器
  3. 远程日志服务器
  4. os配置参数
  5. 防火墙关闭或开放端口

有些是非必须的, 有些是为了私有化部署的内容, 选择性使用;

时间同步, 指定内部 ntp server

1
2
3
4
5
6
7
yum install -y chrony

sed -i "s/^server/#server/" /etc/chrony.conf
sed -i "/3.centos/a server 10.2.2.5 iburst" /etc/chrony.conf

systemctl restart chronyd.service
systemctl enable chronyd.service

os配置参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 文件描述符
echo "* - nofile 102400" >> /etc/security/limits.conf

sysctl -w vm.swappiness=0
swapoff -a

# 将桥接的 IPv4 流量传递到 iptables 的链; 让 iptable 能看到桥接的流量
cat > /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# 这里的配置主要目的是将二层的流量转到 iptables, 因为默认 iptable 只处理三层的包;
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

# 载入 ipset 和 ipvsadm 模块
# 注意升级内核后才是 nf_conntrack 模块, 没有升级是另外一个名字
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules

防火墙

此处为了方便直接停了, 实际可以不停止, 信任相关主机段地址, 或者开放个别端口也可以的;

1
2
3
4
5
systemctl stop firewalld.service
systemctl disable firewalld.service

systemctl stop iptables
systemctl disable iptables

etcd 环境准备

k8s内的etcd架构选型

可以有多种方式来部署 etcd.

1: 外部单节点:个人测试环境首选, 资源消耗少;

2. 外部集群模式:私有生产环境推荐, 不开启 ssl, 要节约很多CPU资源和同步开销;

3. 外部集群模式 + ssl: 公有云或非可控环境, 还是老实上 ssl 加个密吧;

4. 内部独立节点
即 kubeadm 初始化时, 每个 master 初始化一个独立的 etcd 节点, 非 etcd 集群;

5. 内部集群节点
即 kubeadm 初始化时, 每个 master 初始化一个 etcd 节点, 组成 etcd 集群;

个人更推荐外部集群方式, 减少关联耦合度, 方便后期升级维护啥的。

外部集群推荐使用 systemd 二进制部署, 减少环境依赖和冲突; 或者是 docker 部署;

说明

我的homelab环境早期使用独立一台物理机开 3 节点 kvm 虚拟机来跑 ssl etcd, 发现就算是空跑, 底层也要占 10%CPU。
当另外部署好了 k8s 集群 5 节点空跑后, 这台只跑 etcd 的机器 cpu 就烧到 20+% 了, 消耗较多;
改为物理机通过 docker 跑 3 节点 etcd,不使用 ssl, cpu 就只占 3-4%;
最后干脆etcd单节点运行, CPU占用就几乎忽略不计了

systemd 部署方式

/opt/k8s/etcd/etcd.env

1
2
3
4
5
#[Member]
ETCD_NAME="etcd-1"
ETCD_DATA_DIR="/opt/k8s/etcd/data"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"

/usr/lib/systemd/system/etcd.service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/opt/k8s/etcd/etcd.env
ExecStart=/opt/k8s/etcd/etcd
Restart=on-failure
RestartSec=3
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

docker-compose 部署方式

镜像准备

1
2
3
4
# v3.4.24
docker pull quay.io/coreos/etcd:v3.4.24
docker tag quay.io/coreos/etcd:v3.4.24 registry.wait/cwx/coreos/etcd:v3.4.24
docker push registry.wait/cwx/coreos/etcd:v3.4.24

示例采用的是单节点多实例的方式, 根据实际情况拆开来即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
version: '3'
services:
  etcd1:
    image: registry.wait/cwx/coreos/etcd:v3.4.24

    environment:
      - ETCD_NAME=etcd1
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2370
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380
      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379
      - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER_STATE=new

    ports:
      - 2370:2370

  etcd2:
    image: registry.wait/cwx/coreos/etcd:v3.4.24

    environment:
      - ETCD_NAME=etcd2
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2371
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380
      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2371
      - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER_STATE=new
    ports:
      - 2371:2371

  etcd3:
    image: registry.wait/cwx/coreos/etcd:v3.4.24

    # networks:
    #   - etcd
    environment:
      - ETCD_NAME=etcd3
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2372
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380
      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2372
      - ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER_STATE=new
    ports:
      - "2372:2372"

准备相关k8s镜像

多种办法获取镜像

方法一: 从各种镜像站下载

方法二: 直接在 github 下载提供的 server 二进制文件包, 解压后里面就带了主要的镜像

如果没有私有仓库, 就提前导入到各节点;
但是推荐上传到私有仓库去, 方便后续维护;

containerd

先准备 containerd 的配置文件,文件太长, 这里暂时不贴了, 可以点击此链接下载
下载 config.toml

可以使用命令生成默认的配置文件
containerd config default > /etc/containerd/config.toml

然后进行自定义修改;
主要修改内容

  1. 修改 cgroup 为 systemd
  2. 增加私有仓库
  3. 修改 sandbox_image 沙盒镜像的仓库路径

安装程序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cri-containerd-1.6.14-linux-amd64.tar.gz

tar xf cri-containerd-1.6.14-linux-amd64.tar.gz -C /

删除默认的 cni 插件配置文件, 这个是桥接的配置, 会导致初始化时启动的容器获取到错误的地址;
rm -f /etc/cni/net.d/10-containerd-net.conflist

拷贝主配置文件内容
/etc/containerd/config.toml

systemctl enable containerd --now
systemctl restart containerd

kubeadm 安装

方法一: 使用官方的 yum 仓库,然后 yum 安装;

1
yum install -y kubelet kubeadm kubectl socat conntrack-tools

方法二: 直接上传需要使用的 3 个二进制文件, kubelet, kubeadm, kubectl;
然后配置相关 systemd 单元文件和配置文件;

此处采用方法二, 也更推荐方法二

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 先创建相关目录\
mkdir -p /opt/k8s/bin

mkdir -p /etc/systemd/system/kubelet.service.d \
mkdir -p /etc/kubernetes/manifests

# 上传 3 个二进制文件
/opt/k8s/bin/kubelet
/opt/k8s/bin/kubeadm
/opt/k8s/bin/kubectl

kubelet 的 systemd 文件
/usr/lib/systemd/system/kubelet.service
下载 kubelet.service

用于传递参数给 kubelet 的 systemd 文件
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
下载 10-kubeadm.conf

systemctl daemon-reload
systemctl enable kubelet –now

准备初始化配置文件

kubeadm-config.yml
文件太长, 这里暂时不贴了, 可以点击此链接下载
下载 kubeadm-config.yml


初始化

  1. 提前拉取镜像
    kubeadm config images pull –config kubeadm-config.yml

  2. 第一个节点初始化
    kubeadm init –config=kubeadm-config.yml

  3. 上传密钥
    避免后面新增节点时再来回拷贝证书文件
    kubeadm init phase upload-certs –upload-certs –config kubeadm-config.yml

此时已经完成核心组件部分的安装

安装网络插件 calico

官方站点下载 资源文件, 然后安装, 也就一条命令
配置文件需要修改一下,主要就是仓库镜像位置和自己的网段信息

1
2
- name: CALICO_IPV4POOL_CIDR
    value: "10.20.0.0/16"

kubectl apply -f calico.yaml

部署第一个服务

简述:

  1. 创建一个 命名空间
  2. 创建一个 services
  3. 创建一个 Deployment 发布
  4. 通过 nodePort 暴露端口

kubectl apply -f baseweb.yaml

Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2023-03-23 00:00 UTC