【 云原生】01-kubeadm部署k8s集群

目录

  • 1、环境规划
  • 2、主机初始化环境配置
  • 3、安装Docker环境
    • 3.1 为Docker配置镜像加速器
  • 4、部署Kubernetes集群
    • 4.1 配置Kubernetes-yum源
    • 4.2 安装Kubeadm-1.18.0、Kubelet-1.18.0、Kubectl-1.18.0
    • 4.3 K8S-Master初始化
    • 4.4 生成永久性Token
  • 5、添加Node节点
  • 5、部署CNI网络插件(Flannel)
  • 6、查看K8S集群内所有Node、Pod运行状态。
  • 7、测试K8S集群

1、环境规划

操作系统 IP地址 主机名 组件
CentOS7.5 192.168.8.2 k8s-master kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0
CentOS7.5 192.168.8.3 k8s-node01 kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0
CentOS7.5 192.168.8.4 k8s-node02 kubeadm-1.18.0、kubelet-1.18.0、kubect-1.18.0

注意:所有主机配置推荐CPU:2核+ Master推荐Mem:4G+,Node推荐Mem2G+

架构图本次K8S部署版本:1.18.0

【 云原生】01-kubeadm部署k8s集群_第1张图片

2、主机初始化环境配置

所以主机执行

#所有主机建立免交互,3个主机都需要生成公私钥并公钥发送给其他主机。
[root@k8s-master ~]# ssh-keygen                 		#一直回车,生成公钥、私钥
[root@k8s-master ~]# ll /root/.ssh/          		#查看公钥文件、私钥文件、以认证主机地址
总用量 16
-rw------- 1 root root  804 912 22:07 authorized_keys       #保留其他公钥
-rw------- 1 root root 1675 912 22:06 id_rsa                #私钥文件
-rw-r--r-- 1 root root  408 912 22:06 id_rsa.pub            #公钥文件
-rw-r--r-- 1 root root  346 912 22:07 known_hosts           #以认证、已知主机

[root@k8s-master ~]# ssh-copy-id 192.168.8.3    		#输入对方root用户密码,将公钥发送给8.3主机建立免交互
[root@k8s-master ~]# ssh-copy-id 192.168.8.4    		#输入对方root用户密码,将公钥发送给8.4主机建立免交互

[root@k8s-node01 ~]# ssh-keygen 
[root@k8s-node01 ~]# ssh-copy-id 192.168.8.2
[root@k8s-node01 ~]# ssh-copy-id 192.168.8.4

[root@k8s-node02 ~]# ssh-keygen 
[root@k8s-node02 ~]# ssh-copy-id 192.168.8.2
[root@k8s-node02 ~]# ssh-copy-id 192.168.8.3

#关闭防火墙
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# systemctl disable firewalld

#关闭SELinux
[root@k8s-master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@k8s-master ~]# setenforce 0

#关闭swap分区
[root@k8s-master ~]# swapoff -a 
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab


#配置主机名和hosts映射
[root@k8s-master ~]# hostnamectl set-hostname --static k8s-master && bash   #更改主机名
[root@k8s-node01 ~]# hostnamectl set-hostname --static k8s-node01 && bash
[root@k8s-node02 ~]# hostnamectl set-hostname --static k8s-node02 && bash
[root@k8s-master ~]# cat >> /etc/hosts << EOF
192.168.8.2 k8s-master
192.168.8.3 k8s-node01
192.168.8.4 k8s-node02
EOF
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts  
[root@k8s-master ~]# scp /etc/hosts [email protected]:/etc/hosts

#修改Linux内核参数
[root@k8s-master ~]# cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1      #将桥接的IPV4流量传递到iptables的链
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@k8s-master ~]# sysctl -p     #让内核参数立即生效


#配置时间同步
[root@k8s-master ~]# yum -y install ntpdate
[root@k8s-master ~]# ntpdate ntp.aliyun.com             #阿里时钟服务器,如果在生产环境中的话需要写定时任务来定期同步

3、安装Docker环境

所有主机执行

[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && mv ./docker-ce.repo /etc/yum.repos.d/
[root@k8s-master ~]# yum makecache fast      			#建立yum缓存
[root@k8s-master ~]# yum -y install yum-utils lvm2 device-mapper-persistent-data
[root@k8s-master ~]# yum -y install docker-ce    		#安装docker-ce
[root@k8s-master ~]# systemctl enable --now docker

3.1 为Docker配置镜像加速器

所有主机执行
很多镜像都是在国外的服务器上,由于网络问题,经常导致无法拉取镜像的错误,所以最好将镜像拉取地址设置成国内的。目前国内很多公有云提供商都提供了镜像加速服务。镜像加速配置如下。
将镜像加速器地址直接写入/etc/docker/daemon.json文件内,如果文件不存在,可直接新建文件并保存。通过该文件扩展名可以看出,daemon.json的内容符合json格式,书写时要注意。同时,由于单一镜像服务器存在不可用的情况,在配置加速器时推荐配置两个或多个加速地址。

https://hub-mirror.c.163.com    //网易云加速器
https://dockerhub.azk8s.cn      //Azuer中国镜像

[root@k8s-master ~]# cat << EOF >> /etc/docker/daemon.json
{ "registry-mirrors": [
	"https://hub-mirror.c.163.com",
	"https://dockerhub.azk8s.cn"	
	]
}
EOF

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker

[root@k8s-master ~]# docker info | tail -5
 Registry Mirrors:
  https://hub-mirror.c.163.com/
  https://e815eh6a.mirror.aliyuncs.com/
 Live Restore Enabled: false

4、部署Kubernetes集群

4.1 配置Kubernetes-yum源

所有主机执行

[root@k8s-master ~]# cat << EOF >> /etc/yum.repos.d/kubernetes.repo
[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@k8s-master ~]# yum makecache fast        #建立yum缓存

4.2 安装Kubeadm-1.18.0、Kubelet-1.18.0、Kubectl-1.18.0

所有主机执行
kubelet刚完成安装后,通过systemctl start kubelet方式是无法启动的,需要加入节点或初始化master后才可以启动成功。如果在命令执行过程中出现索引gpg检查失败的情况,可以使用yum -y install --nogpgcheck kubelet kubeadm kubectl来安装。

[root@k8s-master ~]# yum -y install kubeadm-1.18.0 kubectl-1.18.0 kubelet-1.18.0
[root@k8s-master ~]# systemctl enable kubelet

4.3 K8S-Master初始化

master端执行
以下字段解释
–apiserver-advertise-address:定义master端IP地址。
–image-repository:指向国内的镜像仓库,这里使用阿里云的。
–kubernetes-version:定义k8s版本要和yum安装的版本一直,不然会报错。
–service-cid:定义k8s中Service地址范围。
–pod-network-cidr:定义k8s中Pod地址范围

[root@k8s-master ~]#  kubeadm init \
--apiserver-advertise-address=192.168.8.2 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

以上操作会拉取:kube-apiserver、kube-controller-manager、kube-scheduler并部署安装前检查、初始化K8S集群、拉取K8S相关组件、部署启动组件。由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
根据提示操作
kubectl默认会在执行的用户家目录下面的.kube目录下寻找config文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf拷贝到.kube/config

复制k8s初始化后终端上输出的命令,并执行。
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubeadm init主要执行了以下操作
[init]:指定版本进行初始化操作。
[preflight]:初始化前的检查和下载所需的Docker镜像文件。
[kubelet-start]:生成kubelet的配置件”/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失败。
[certificates]:生成kubernetes使用的证书,存放在/etc/Kubernetes/pki目录中。
[kubeconfig]:生成Kubeconfig文件,存大在/etc/Kubernetes目录中,组件之间通信要使用对应文件。
[control-plane]:使用/etc/Kubernetes/manifest目录下的YAML文件,安装Master组件。
[etcd]:使用/etc/Kubernetes/manifest/etcd.yaml安装Etcd服务。
[wait-control-plane]:等待control-plan部署的Master组件启动。
[apiclient]:检查Master组件服务状态。
[uploadconfig]:更新配置。
[kubelet]:使用configMap配置kubelet。
[patchnode]:更新CNl信息到Node上,通过注释的方式记录
[mark-control-plane] :为当前节点打标签,打了角色的Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。
[bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到。
[addons]:安装附加组件CoreDNS和kube-proxy。
kubeadm通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如k8s-master节点上查看节点信息都是”Not Ready”状态、Pod的CoreDNS无法提供服务等。

4.4 生成永久性Token

master端执行
安装完master节点后会自动生成一下token,有效期24小时,所有需要重新创建一个永久token。
如下所示。
安装完master节点后,token信息示例,该token会在master初始化完毕后在终端显示,先不要复制执行。

kubeadm join 192.168.8.2:6443 --token ev9rs3.nelq7yugehwkzmzl \
    --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d 

使用命令查看token信息

[root@k8s-master ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
ev9rs3.nelq7yugehwkzmzl   23h         2021-09-13T22:56:31+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token

有效期还有23小时,23h

创建永久性token

[root@k8s-master ~]# kubeadm token create --ttl 0 --print-join-command
kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o     --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d

再次查看token信息

TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
ev9rs3.nelq7yugehwkzmzl   23h         2021-09-13T22:56:31+08:00   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token
kiqurj.aytxdn8gbq0p992i   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
sg2voo.7u8ifc4ymhwqe25o   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
vbq6si.8g6p1pxa6di74olx   <forever>   <never>   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

可以看到“sg2voo.7u8ifc4ymhwqe25o......token的标识为forever(永久)。

5、添加Node节点

所有node主机上执行
将master生成的永久性token复制到要加入到K8S集群中的机器上执行。
最后提示:Run ‘kubectl get nodes’ on the control-plane to see this node join the cluster. 添加成功,则为添加成功。

[root@k8s-node01 ~]# kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o     --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d
[root@k8s-node02 ~]# kubeadm join 192.168.8.2:6443 --token sg2voo.7u8ifc4ymhwqe25o     --discovery-token-ca-cert-hash sha256:4605d3efa9f04b561ca4660a855779f8855a1c7999d5166590ec5e40a1374f0d

在Master端查看集群状态

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   10m     v1.18.0
k8s-node01   NotReady   <none>   5m16s   v1.18.0
k8s-node02   NotReady   <none>   5m14s   v1.18.0

可以看到各个节点之间的状态为NotReady,这是因为没有安装网络插件导致的,接下来安装网络插件CNI

5、部署CNI网络插件(Flannel)

Master端执行
master节点NotReady和pod coredns不可用的的原因就是因为没有使用任何的网络插件,此时Master的连接还不正常。目前最流行的kubernetes网络插件有 Flannel、Calico、Canal、Weave,这里选择Flannel插件。

[root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml			#下载flannel.yml文件,如果下载失败可以使用windows主机下载,然后在上次至服务器内。

[root@k8s-master ~]# kubectl apply -f  kube-flannel.yml       #执行flannel-yml文件
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

6、查看K8S集群内所有Node、Pod运行状态。

查看所有Pod状态
[root@k8s-master ~]# kubectl get pods --all-namespaces           #查看所有命名空间内的Pod
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE
kube-system   coredns-7ff77c879f-j2jnk             1/1     Running   0          18m
kube-system   coredns-7ff77c879f-tl62r             1/1     Running   0          18m
kube-system   etcd-k8s-master                      1/1     Running   1          18m
kube-system   kube-apiserver-k8s-master            1/1     Running   1          18m
kube-system   kube-controller-manager-k8s-master   1/1     Running   1          18m
kube-system   kube-flannel-ds-d7d8q                1/1     Running   0          5m53s
kube-system   kube-flannel-ds-fzqph                1/1     Running   0          5m53s
kube-system   kube-flannel-ds-vccnw                1/1     Running   0          6s
kube-system   kube-proxy-kkzmr                     1/1     Running   0          13m
kube-system   kube-proxy-psmfp                     1/1     Running   0          13m
kube-system   kube-proxy-t6frp                     1/1     Running   1          18m
kube-system   kube-scheduler-k8s-master            1/1     Running   1          18m

查看Node节点状态
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   19m   v1.18.0
k8s-node01   Ready    <none>   14m   v1.18.0
k8s-node02   Ready    <none>   14m   v1.18.0

可以看到Pod、Node状态都是正常的

7、测试K8S集群

发布一个资源nginx

[root@k8s-master ~]# kubectl create deployment nginx --image=nginx    #创建nginx 资源deployment
deployment.apps/nginx created

[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort   #暴露端口
service/nginx exposed

[root@k8s-master ~]# kubectl get svc      查看service,默认命名空间为default
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        21m
nginx        NodePort    10.100.132.231   <none>        80:30254/TCP   16s

使用K8S集群中的任意节点IP+31829端口访问都可以访问该nginx-service。
任意集群主机地址+30254

【 云原生】01-kubeadm部署k8s集群_第2张图片【 云原生】01-kubeadm部署k8s集群_第3张图片

【 云原生】01-kubeadm部署k8s集群_第4张图片
到此一个简单的K8S集群就部署完成了

你可能感兴趣的:(云原生,k8s)