目录

kubernetes基础-kubeadm安装部署k8s

如何使用kubeadm安装部署k8s.

集群规划

1. 机器选型

信息

目前在创建Kubernetes集群时,存在着使用很多小规格ECS的现象,这样做有以下弊端:

  1. 小规格 Woker ECS网络资源受限

  2. 如果一个容器基本可以占用一个小规格ECS,此ECS的剩余资源就无法利用(构建新的容器或者是恢复失败的容器),在小规格ECS较多的情况下,存在资源浪费

使用大规格ECS的优势:

  1. 网络带宽大,对于大带宽类的应用,资源利用率高

  2. 容器在一台ECS内建立通信的比例增大,减少网络传输

  3. 拉取镜像的效率更高。因为镜像只需要拉取一次就可以被多个容器使用。而对于小规格的ECS拉取镜像的次数就会增多,若需要联动ECS伸缩集群,则需要花费更多的时间,反而达不到立即响应的目的。

2. Master 节点规格

信息

通过容器服务创建的Kubernetes集群,Master节点上运行着etcd、kube-apiserver、kube-controller等核心组件,对于Kubernetes集群的稳定性有着至关重要的影响,对于生产环境的集群,必须慎重选择Master规格。

  1. Master规格跟集群规模有关,集群规模越大,所需要的Master规格也越高。

  2. 您可从多个角度衡量集群规模,例如节点数量、Pod数量、部署频率、访问量。这里简单的认为集群规模就是集群里的节点数量。

  3. 对于常见的集群规模,可以参见如下的方式选择Master节点的规格(对于测试环境,规格可以小一些。下面的选择能尽量保证Master负载维持在一个较低的水平上)。

节点规模 Master规格
1~5个节点 4核8G
6~20个节点 4核16G
21~100个节点 8核32G
100~200个节点 16核64G

3. Node 节点规格

确定整个集群的日常使用的总核数以及可用度的容忍度。

注意
集群总的核数有160核,可以容忍10%的错误。那么最小选择10台16核ECS,并且高峰运行的负荷不要超过160 * 90%=144核。如果容忍度是20%,那么最小选择5台32核ECS,并且高峰运行的负荷不要超过160 * 80%=128核。这样就算有一台ECS出现故障,剩余ECS仍可以支持现有业务正常运行。

确定 CPU:Memory 比例。对于使用内存比较多的应用例如Java类应用,建议考虑使用1:8的机型。

集群安装

实验环境操作系统全部 centos7.7

节点IP 节点角色
192.168.9.163 master
192.168.9.164 node01
192.168.9.166 node02
192.168.9.168 hub.test.com

1. 基础及依赖包

yum install conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git -y

2. 关闭firewalld,安装iptables并启用

1
2
3
4
5
6
7
systemctl stop firewalld &&\
systemctl disable firewalld &&\
yum install iptables iptables-services -y &&\
systemctl start iptables &&\
systemctl enable iptables  &&\
iptables -F &&\
service iptables save

3. 关闭selinux

1
2
3
4
5
setenforce 0 &&\
sed -i "s/enforcing/disabled/g" /etc/selinux/config

swapoff -a
sed -i '/swap/ s/^/#&/' /etc/fstab

4. 内核优化

可以看看我之前这一篇关于主机的相关优化配置:Linux操作系统-内核优化

5. 系统升级内核到4.4以上

Centos 7.x 系统自带的 3.10.x 内核存在一些 bugs,导致运行docker、k8s 不稳定。因此系统需要升级内核到4.4以上(增加k8s运行的稳定性)。

5.1 安装epel源

yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

5.2 查看内核版本

yum --disablerepo=* --enablerepo=elrepo-kernel list kernel*

5.3 安装稳定版内核

yum --disablerepo=* --enablerepo=elrepo-kernel install -y kernel-lt

5.4 删除旧版本内核

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看当前系统所有内核版本
rpm -qa |grep kernel*

# 删除旧的内核
rpm -e kernel-3.10.0-1062.1.1.el7.x86_64 && rpm -e kernel-3.10.0-957.el7.x86_64

# 删除旧版工具包
yum remove -y kernel-tools-libs.x86_64 kernel-tools.x86_64

# 安装新版工具包
yum --disablerepo=* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64

6. 开启ipvs的前置条件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

7. 安装Docker

可以看看我之前这一篇关于Docker安装的相关教程:Docker安装

8. 所有节点安装kubeadm

配置官方repository源,通过yum安装 kubelet, kubectl, kubeadm 组件

8.1 配置kubeadm源

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
注意

如果官方源下载太慢可以使用阿里云的kubeadm源

1
2
3
4
5
6
7
8
9
cat  > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubelet, kubectl, kubeadm 组件(默认是最新版的,本文当前版本是1.20.15)

yum install kubeadm-1.20.15 kubectl-1.20.15 kubelet-1.20.15 -y

kubelet 开机自启,不然系统重启后 kuberbetes 节点会出现问题。

systemctl enable kubelet

8.2 初始化kubeadm

原始的kubernetes镜像文件在gcr上,下载可能会出现网络问题。可以使用阿里云的镜像加速。

1
2
3
4
5
6
7
8
# 配置docker国内镜像加速地址,这个是使用阿里云的加速器,国内其他的也可以。
 cat /etc/docker/daemon.json 
{
    "registry-mirrors":["https://ns2wtlx2.mirror.aliyuncs.com"]
}

# 然后kubeadm config print init-defaults > kubeadm-config.yaml 修改配置文件
imageRepository: k8s.gcr.io 为 imageRepository: registry.aliyuncs.com/google_containers。

9. 初始化master节点

生成默认配置文件

kubeadm config print init-defaults > kubeadm-config.yaml

修改以下配置文件

 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
50
51
52
53
54
55
56
57
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.9.163
  # 修改master的IP地址
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.20.15
networking:
  dnsDomain: cluster.local
  podSubnet: "10.224.0.0/16"
  # 新增pods互相通信的网段,不要与宿主机的同一网段
  serviceSubnet: 10.96.0.0/16
scheduler: {}
controlPlaneEndpoint: "192.168.9.245:6444"
# 添加vip及6444端口(转发到6443),给其他master加入,也可以后期通过编辑configmap添加

# 1.17以上开启ipvs
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
# 1.17以下
---
# 启用ipvs支持
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs
注意

上面仅适用于 1.15 以下,更高版本开启 ipvs,修改 ConfigMap 的 kube-system/kube-proxy 中的 config.conf,把 mode: "" 改为 mode: "ipvs" 保存退出即可

kubectl edit cm kube-proxy -n kube-system

开始初始化master节点

kubeadm init --config=kubeadm-config.yaml --upload-certs |tee k8s-init.log

技巧
更高版本将参数 –experimental-upload-certs 替换为 --upload-certs

配置 kubeconfig

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

10. 安装Pod Network

安装 flannel

1
2
3
4
5
6
7
8
mkdir ~/install-k8s/{core,plugin} -p &&\
mkdir ~/install-k8s/plugin/flannel &&\
mv ~/k8s-init.log ~/kubeadm-config.yaml ~/install-k8s/core &&
cd ~/install-k8s/plugin/flannel &&\
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml &&\
kubectl create -f kube-flannel.yml
# 或者 
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
警告

注意:flannel需要在所有节点需要做snat转发,pod内部才能访问到外部网络

iptables -t nat -I POSTROUTING -s 10.224.0.0/16 -j MASQUERADE

另外一种比较热门的网络插件,calico,与上面的flannel选择其中一种安装即可

  1. 下载 calico 部署文件,不然直接kubectl apply 网段是192.168.0.0

    wget https://docs.projectcalico.org/v3.10/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

  2. 替换 calico 部署文件的 IP 为 kubeadm 中的 networking.podSubnet 参数 10.244.0.0

    sed -i 's/192.168.0.0/10.224.0.0/g' calico.yaml

  3. 部署 Calico 插件

    kubectl apply -f calico.yaml

11. 加入从节点

11.1 打印加入集群语句

kubeadm token create --print-join-command

11.2 加入从节点

1
2
kubeadm join 192.168.9.163:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:f09d704cfdb77dbe92edd4ae5eec3b22e9d6934698ead137b42b0927513aabe4

12 加入主节点

作为master节点,在上面那一句后面追加参数 --experimental-control-plane,注意,--experimental-control-plane 参数在1.15+版本需要替换为 --control-plane

--certificate-key 通过这句 kubeadm init phase upload-certs --upload-certs 生成 token

1
2
3
 kubeadm join k8s-master.ycf.com:6444 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:80b61b460abda543e12790ed8da3ddd3d6b73bf4c16eee03b7e4d2782ccbaaea \
    --control-plane --certificate-key 8683928a69347a48efbc2b4359b779dadd0e6668e0c6910a1bd32127d0af966e

13 重置节点

移除掉 kubernetes 在服务器节点上上面的安装信息

1
2
3
4
5
6
7
8
9
kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/kubelet
rm -rf /etc/kubernetes
rm -rf /var/lib/cni/
rm -rf ~/.kube

14. 配置harbor

敬请期待…