Hot For Coding

如何在CentOS7上通过kubeadm快速安装k8s集群

full k8s install on CentOS7

本文介绍一下如何在CentOS7上通过kubeadm快速安装k8s集群,以下每一步骤我都亲自测试过,现在要搭建一个k8s集群相比前两年太容易了,只需要使用官方推荐的kubeadm工具即可快速初始化出一个k8s集群

准备

  • CentOS7系统,记得是7
  • 内存不小于2G
  • CPU双核以上
  • 所有机器直接网络互通
  • 唯一的Hostname
  • 防火期推荐关闭,使用外层的防火墙策略
  • Swap关闭

本文机器例子

HostnameIPOS
cp1172.16.11.199CentOS7
worker1172.16.11.198CentOS7
worker2172.16.11.197CentOS7

关闭Swap

在所有机器上关闭Swap,必须关闭

swapoff -a

检查一下

$  free -hm
              total        used        free      shared  buff/cache   available
Mem:            15G        409M         13G        844K        2.0G         14G
Swap:            0B          0B          0B

Swap那一行都是0,已关闭

修改Hostname

为了更好的管理k8s集群节点,推荐使用规范的Hostname,可以修改/etc/hostname,如果你想马上立即生效也可以使用hostname命令直接修改。

以下例子为修改hostnamecp1的例子

# 第一种方式
$ sudo echo 'cp1' > /etc/hostname

# 第二种方式
$ sudo hostname cp1

修改Hosts

在所有的节点执行以下命令

$ sudo cat <<EOF | sudo tee /etc/hosts
172.16.11.199 k8s-api.cluster

172.16.11.199 cp1
172.16.11.198 worker1
172.16.11.197 worker2
EOF

这一步目的是让k8s集群的API Server不是以IP的形式暴露出来,而是暴露一个Hostname,这样方便后期增加Control plane节点时容易扩展。

假如你有Load Balance,那么这一步就省略了

关闭SELinux

CentOS/Redhat家族自研了一个安全的组件SELinux,可惜Kubernetes现在还不支持它,所以需要在所有的机器执行以下命令关闭它,在所有机器执行以下命令

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

安装Docker

在所有机器执行以下命令

先删除旧的

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

配置YUM源

# 安装YUM工具
sudo yum install -y yum-utils

# 添加YUM源
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 如果慢,可以添加国内阿里源
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repos

安装Docker

sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker

sudo systemctl start docker

开机启动

sudo systemctl enable --now docker

检查一下

$ docker info
Client:
 Debug Mode: false

Server:
 Containers: 39
  Running: 18
  Paused: 0
  Stopped: 21
 Images: 22
 Server Version: 19.03.8
 Storage Driver: overlay2
  Backing Filesystem: <unknown>
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: systemd
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.21.3.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 15.51GiB
 Name: master
 ID: RJPP:7QNK:BKZ3:UM2F:DD72:HT4I:TNRQ:C7WY:USDZ:ZHJC:4NXA:56NL
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

设置系统内核

在所有的机器执行以下命令

sudo cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

安装kube系列命令

在所有机器执行以下命令

先设置YUM源

sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
EOF

安装kubeadm, kubect和kubectl,推荐安装PATCH版本号大于等于5的最新版本,这是我之前付出血的代价换来的真知。目前PATCH大于等于5的版本就是v1.17.5

sudo yum install kubeadm-1.17.5-0.x86_64 kubelet-1.17.5-0.x86_64 kubectl-1.17.5-0.x86_64

验证一下版本

$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.5", GitCommit:"e0fccafd69541e3750d460ba0f9743b90336f24f", GitTreeState:"clean", BuildDate:"2020-04-16T11:41:38Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

开机启动

sudo systemctl enable --now kubelet

初始化k8s集群cp1节点

在cp1节点上执行以下命令

kubeadm init \
    --pod-network-cidr=192.168.0.0/16 \
    --control-plane-endpoint=k8s-api.cluster \
    --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

以上步骤成功之后,记录一下末尾打印出的Worker节点join命令,待会要join worker节点时会用到,并顺便执行以下三条命令

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

安装网络插件

kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml

注意,这里安装的是Calico网络插件,因为上一步kubeadm init--pod-network-cidr指定的是192.168.0.0/16,不同的网络插件对于IP段有不同的要求,如果你要使用别的网络插件请注意修改这个参数

在安装过程中,如果出错,请使用以下命令初始化

kubeadm reset

安装完网络插件之后,就可以使用以下命令观察一下Node是不是Ready状态

$ watch kubectl get no
Every 2.0s: kubectl get no                                                                                                                                   Tue May 12 15:16:51 2020

NAME     STATUS     ROLES    AGE   VERSION
cp1      NotReady   master   2m    v1.17.5

以上命令每2秒都会刷新一次,一旦STATUS变成Ready状态,即可下一步

加入Worker节点到集群

在worker1和worker2执行以下命令加入节点,join命令从cp1节点kubeadm init成功后的结果输出里获取的

kubeadm join k8s-api.cluster:6443 \
    --token rn3yeq.mvtg48ffisyfk6eo \
    --discovery-token-ca-cert-hash sha256:2ac267dee683c38278f14d282a58a37c7509d775471c6bce6a8ff2cddadc92e7

如果join成功,你切换到cp1节点执行以下命令获取node状态

$ watch kubectl get no
Every 2.0s: kubectl get no                                                                                                                                   Tue May 12 15:26:41 2020

NAME      STATUS     ROLES    AGE   VERSION
cp1       Ready      master   37m   v1.17.5
worker1   NotReady   <none>   2m    v1.17.5
worker2   NotReady   <none>   2m    v1.17.5

过一会,不出意外,你应该会看到全部节点Ready

$ watch kubectl get no
Every 2.0s: kubectl get no                                                                                                                                   Tue May 12 15:36:27 2020

NAME      STATUS     ROLES    AGE   VERSION
cp1       Ready      master   37m   v1.17.5
worker1   Ready      <none>   12m   v1.17.5
worker2   Ready      <none>   12m   v1.17.5

恭喜您,您已成功搭建了一个3节点的k8s集群,开始你的k8s之旅吧!

分享

TITLE: 如何在CentOS7上通过kubeadm快速安装k8s集群

LINK: https://www.qttc.net/520-how-setup-k8s-on-centos7.html

NOTE: 原创内容,转载请注明出自琼台博客