centos7使用kubeadm安装Kubernetes 1.19版本

一、Kubernetes简介

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,可以将Docker看成Kubernetes内部使用的低级别组件。 Kubernetes不仅支持Docker,还支持Rocket,这是另一种容器技术。使用Kubernetes可以实现如下功能:

  • 自动化容器的部署和复制;
  • 随时扩展或收缩容器规模;
  • 将容器组织成组,并且提供容器间的负载均衡;
  • 很容易地升级应用程序容器的新版本;
  • 提供容器弹性,如果容器失效就替换它等。

下图为kubernetes各个组件的作用:

使用kubeadm 设置一个高可用的 Kubernetes 集群的两种不同方式:

  • 使用堆控制平面节点。这种方法所需基础设施较少。etcd 成员和控制平面节点位于同一位置。
  • 使用外部集群。这种方法所需基础设施较多。控制平面的节点和 etcd成员是分开的。

使用堆控制平面节点

堆叠(Stacked) HA 集群是一种这样的拓扑,其中 etcd 分布式数据存储集群堆叠在 kubeadm 管理的控制平面节点上,作为控制平面的一个组件运行。

每个控制平面节点运行 kube-apiserver,kube-scheduler 和 kube-controller-manager 实例。

kube-apiserver 使用负载均衡器暴露给工作节点。

每个控制平面节点创建一个本地 etcd 成员(member),这个 etcd成员只与该节点的 kube-apiserver 通信。这同样适用于本地 kube-controller-manager 和 kube-scheduler 实例。

这种拓扑将控制平面和 etcd 成员耦合在同一节点上。相对使用外部etcd 集群,设置起来更简单,而且更易于副本管理。

然而,堆叠集群存在耦合失败的风险。如果一个节点发生故障,则etcd 成员和控制平面实例都将丢失,并且冗余会受到影响。您可以通过添加更多控制平面节点来降低此风险。

因此,您应该为 HA 集群运行至少三个堆叠的控制平面节点。

这是 kubeadm 中的默认拓扑。当使用 kubeadm init 和 kubeadmjoin --control-plane 时,在控制平面节点上会自动创建本地 etcd 成员。

使用外部集群

具有外部 etcd 的 HA 集群是一种这样的拓扑,其中 etcd 分布式数据存储集群在独立于控制平面节点的其他节点上运行。

就像堆叠的 etcd 拓扑一样,外部 etcd 拓扑中的每个控制平面节点都运行 kube-apiserver,kube-scheduler 和 kube-controller-manager 实例。同样, kube-apiserver 使用负载均衡器暴露给工作节点。但是,etcd 成员在不同的主机上运行,  每个 etcd 主机与每个控制平面节点的 kube-apiserver 通信。

这种拓扑结构解耦了控制平面和 etcd 成员。因此,它提供了一种 HA设置,其中失去控制平面实例或者 etcd 成员的影响较小,并且不会像堆叠的 HA 拓扑那样影响集群冗余。

但是,此拓扑需要两倍于堆叠 HA 拓扑的主机数量。具有此拓扑的 HA 集群至少需要三个用于控制平面节点的主机和三个用于 etcd 节点的主机。

二、环境准备

Kubernetes支持在物理服务器或虚拟机中运行,本次使用虚拟机测试环境,
CPU需要大于2核,内存需大于2G,关闭swap

名称IP地址主机名节点角色
master10.168.1.103mastermaster
node10.168.1.104node1worker
node10.168.1.105node2worker

三、基础操作

设置主机名、主机名解析、内核参数、关闭防火墙、selinux、swap、设置yum源

安装基本软件包

[root@localhost ~]# yum install wget net‐tools vim bash‐comp* ‐y

master环境

1、设置主机名,管理节点设置主机名为master

[root@master ~]# hostnamectl set‐hostname master
[root@master ~]# su ‐

2、编辑hosts文件,设置主机名解析

[root@master ~]# vim /etc/hosts  //添加
10.168.1.103 master
10.168.1.104 node1
10.168.1.105 node2

3、需要先关闭防火墙、selinux和swap。

[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# setenforce 0
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@master ~]# swapoff ‐a
[root@master ~]# sed ‐i 's/.*swap.*/#&/' /etc/fstab

4、配置内核参数,将桥接的IPv4流量传递到iptables的链

[root@master ~]# cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge‐nf‐call‐ip6tables = 1
net.bridge.bridge‐nf‐call‐iptables = 1
EOF
[root@master~]#sysct1--system
*Applying/usr/1ib/sysct1.d/00-system.conf..…
*Applying/usr/1ib/sysct1.d/10-default-yama-scope.conf...
kernel.yama.ptrace_scope=0
*Applying/usr/1ib/sysct1.d/50-default.conf...
kernel.sysrq=16
kernel.core_uses_pid=1
net.ipv4.conf.default.rp filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.accept_source_route=e net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.default.promote_secondaries=1
net.ipv4.conf.all.promote_secondaries=1
fs.protected_hardlinks=1
fs.protected_symlinks=1
*Applying/etc/sysct1.d/99-sysctl.conf...
*Applying /etc/sysct1.d/k8s.conf...
*Applying /etc/sysctl.conf...

5、配置阿里云的kubernetes的yum源

[root@master ~]# cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@master ~]# yum clean all
[root@master ~]# yum repolist

可以看到kubernetes的源生效了

node环境

备注:(node1节点和node2节点都要配置,配置相同)这里只贴出node1

安装基本软件包(相同)

[root@localhost ~]# yum install bash‐comp* vim net‐tools wget ‐y

1、设置主机名,管理节点设置主机名为node1(node2的设置为node2)

[root@node1 ~]# hostnamectl set-hostname node1
[root@node1 ~]# su -

2、设置Host解析,编辑/etc/hosts文件,添加域名解析。(相同)

[root@node1 ~]# vim /etc/hosts
10.168.1.103 master
10.168.1.104 node1
10.168.1.105 node2

3、关闭防火墙、selinux和swap。(相同)

[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@node1 ~]# swapoff -a
[root@node1 ~]# sed -i 's/.*swap.*/#&/' /etc/fstab

4、配置内核参数,将桥接的IPv4流量传递到iptables的链(相同)

[root@node1 ~]# cat >> /etc/sysctl.d/k8s.conf <<EOF
> net.bridge.bridge-nf-call-ip6tables = 1
> net.bridge.bridge-nf-call-iptables = 1
> EOF
[root@node1 ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.all.promote_secondaries = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
* Applying /etc/sysctl.conf ...

5、配置阿里云的kubernetes的yum源

[root@master ~]# cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@node1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@node1 ~]# yum repolist

四、环境部署

docker服务安装、kubernetes服务安装

master节点

1、docker-ce安装部署

卸载系统自带docker服务

[root@master ~]# yum ‐y remove docker docker‐common docker‐selinux docker‐engine

查看可安装的docker-ce版本

1、安装docker-ce并启动

[root@master ~]# yum install docker-ce -y
[root@master ~]# systemctl start docker
[root@master ~]# systemctl enable docker

2、kubelet、kubeadm、kubectl安装

查看可安装的版本

安装kubectl

[root@master ~]# yum install kubelet kubeadm kubectl -y
# 设置kubelet的开机自启
[root@master ~]# systemctl enable kubelet

说明:Kubelet负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。Kubectl是Kubernetes集群管理工具。

node节点

两个节点都要进行操作,配置相同

1、docker-ce安装

卸载掉当前默认docker环境

[root@node1 ~]# yum -y remove docker docker-common docker-selinux docker-engine

安装Docker-ce

[root@node1 ~]# yum install docker-ce -y
[root@node1 ~]# systemctl start docker
[root@node1 ~]# systemctl enable docker

2、kubelet、kubeadm、kubectl安装

[root@node1 ~]# yum install kubelet kubeadm kubectl -y
[root@node1 ~]# systemctl enable kubelet

Kubelet负责与其他节点集群通信,并进行本节点Pod和容器生命周期的管理。Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。Kubectl是Kubernetes集群管理工具。

五、集群初始化

master和node节点初始化操作

master节点

1、在master进行Kubernetes集群初始化。

[root@master ~]#  kubeadm init --kubernetes-version=1.19.0 \
--apiserver-advertise-address=10.168.1.103 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

初始化过程(只贴出一部分,没有报错才表示初始化成功)

定义POD的网段为: 10.244.0.0/16,apiserver地址就是master本机IP地址。

这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过--image-repository指定阿里云镜像仓库地址,很多新手初次部署都卡在此环节无法进行后续配置。

集群初始化成功后返回如下信息(只贴出一部分,没有报错才表示初始化成功)

记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行。

kubeadm join 10.168.1.103:6443 --token i5j10u.s4jr5k4hdjuv7xnp \
    --discovery-token-ca-cert-hash sha256:38dac077c809cbe2f28cfdb6b855bbbbd32885ae7a6fce09cc33a34a2ca96af8 

2、配置kubectl工具

[root@master ~]# mkdir -p /root/.kube
[root@master ~]# cp /etc/kubernetes/admin.conf /root/.kube/config
[root@master ~]# kubectl get nodes
[root@master ~]# kubectl get cs

3、部署flannel网络

[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看是否成功创建flannel网络

node节点

注:节点都要操作,在node节点上进行如下操作

执行如下命令,使node1节点加入Kubernetes集群(前面记录的那一个命令)

[root@node1 ~]# kubeadm join 10.168.1.103:6443 --token i5j10u.s4jr5k4hdjuv7xnp \
    --discovery-token-ca-cert-hash sha256:38dac077c809cbe2f28cfdb6b855bbbbd32885ae7a6fce09cc33a34a2ca96af8 

此命令为集群初始化时(kubeadm init)返回结果中的内容。

默认token的有效期为24小时,当过期之后,该token就不可用了。解决方法如下:

重新生成新的token,在master端执行kubeadm token create --print-join-command

六、集群状态检测

检查获取的节点信息、创建pod

master节点操作

1、稍等几分钟,在master节点输入命令检查集群状态,返回如下结果则集群状
态正常。

[root@node1 ~]# kubectl get nodes

重点查看STATUS内容为Ready时,则说明集群状态正常。

2、创建Pod以验证集群是否正常。

[root@master ~]# kubectl create deployment nginx --image=nginx
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
[root@master ~]# kubectl get pod,svc

注意:

在创建完nginx查看状态不正常,这是由于安装完flannel网络没有重启docker的缘故,docker还是默认使用的docker0网络。

systemctl restart docker

重启完之后再次查看状态正常

七、部署K8S的UI

master节点操作

1、创建Dashboard的yaml文件

[root@master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml
[root@master ~]# sed -i  's/k8s.gcr.io/cnbugs/g' recommended.yaml
# 修改端口号为30001
[root@master ~]# sed -i '/targetPort:/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml

2、部署Dashboard

[root@master ~]# kubectl create -f recommended.yaml

3、创建完成后,检查相关服务运行状态

[root@master ~]# kubectl get pods -n kube-system -o wide
[root@master ~]# kubectl get services -n kube-system

查看服务监听

[root@master ~]# netstat -ntlp|grep 30001

4、在Firefox浏览器输入Dashboard访问地址:https://10.168.1.103:30001

5、查看访问Dashboard的认证令牌

[root@master ~]# kubectl create serviceaccount dashboard-admin -n kube-system
[root@master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
[root@master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

输出token值

eyJhbGciOiJSUzI1NiIsImtpZCI6InNvMS03RzkyREtnTEY5YlRsZ09pUlpzNUpMLTlXTlNINDFOM1ZCVE05S2MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tenY5dGoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjZmNGIxYzUtMzY3OC00ZWM5LThkMjktYjcxNjQzM2M3ZjVmIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.l3QmD1NYe1YbNjY3UXwSWr1neurFgEqvu3B9aHqIfoi-pEXhu1_rrakOr7p7iT9WLoJ0NIMbNSvx6XG4A2hiXMg3_r9DkhQSfUOCnSSQke0oWtYfZ_72dw3Rls53Na80ShtFio8C9DJJuvfI8r-8zlhFXIHD9y6qLuH-Ufu3EipUipHL1FnVNeOAyPBFKA3emAvfMRS249T1yf7n4heej52xfzSyyCEkTjle4D62yO0Ovg8RjORa0Rpei5XqVLEWdz7EGPEo5ICRiybkICxMieVHuxD4nm3rUOVrdbcLVjPHKvX8e8ZkGb3kK6FeAohvREwrIeMflb7r7beFn1mMXw

6、复制输出的token登录Dashboard

#用火狐浏览器访问https://10.168.1.103:30001证书问题,只能通过火狐浏览器访问)

认证通过后,登录Dashboard首页如图

至此,Kubernetes安装完成。

查看节点信息

文档参考:

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/ha-topology/

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

老铁们如果在安装过程中出现任何问题可以加群讨论哦,下面附上二维码

发表评论

后才能评论