本文介绍一下如何在CentOS7上通过kubeadm快速安装k8s集群,以下每一步骤我都亲自测试过,现在要搭建一个k8s集群相比前两年太容易了,只需要使用官方推荐的kubeadm工具即可快速初始化出一个k8s集群
准备
- CentOS7系统,记得是7
- 内存不小于2G
- CPU双核以上
- 所有机器直接网络互通
- 唯一的Hostname
- 防火期推荐关闭,使用外层的防火墙策略
- Swap关闭
本文机器例子
Hostname | IP | OS |
---|---|---|
cp1 | 172.16.11.199 | CentOS7 |
worker1 | 172.16.11.198 | CentOS7 |
worker2 | 172.16.11.197 | CentOS7 |
关闭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
命令直接修改。
以下例子为修改hostname
为cp1
的例子
# 第一种方式
$ 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之旅吧!