Kubernetes集群的安装

369 阅读5分钟

系统要求

lADPDgtYwzMWm0TNAjLNA-g_1000_562.jpg

  1. CentOS Linux7系统默认是开启访问墙,由于Kubernetes的Master与工作的Node之间需要大量网络通信,由于访问墙中配置各个组件需要互相通信的端口号,由此我们直接关闭防火墙。
> sudo su 
> systemctl status firewalld
 firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
> systemctl stop firewalld
  1. 在主机上禁用SElinux,让容器可以读取主机文件系统。将SELINUX=enforcing修改disabled。
> vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
  1. Kubernetes需要容器运行的支持,其中有包括:Docker、Containerd、CRI-O和frakt 。我们推荐使用Docker。
> curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
> systemctl enable --now docker
> docker version
Client: Docker Engine - Community
 Version:           20.10.3
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        48d30b5
 Built:             Fri Jan 29 14:34:14 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
 ......

kubernetes集群安装方式

  1. yum install kubernetes方式安装,整个过程需要配置若干参数,整体较为复杂。
  2. Kubernetes从1.4版本后,引入kubeadm命令行工具,简化集群的过程,同时解决Kubernetes集群的高可用问题。

kubeadm对kubernets集群的安装

安装kubeadm和相关工具

  1. 配置yum源
> vi /etc/yum.repos.d/kubernetes.repo
[kuebrnetes]       
name=Kubernetes Repository        
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1       
gpgcheck=0
  1. 使用yum install 命令安装kubeadam相关工具
>  yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
>  yum list installed | grep kub
kubeadm.x86_64                       1.20.4-0                       @kubernates
kubectl.x86_64                       1.20.4-0                       @kubernates
kubelet.x86_64                       1.20.4-0                       @kubernates
  1. 启动kubelet和docker服务,并设置开机自启
> systemctl start docker
> systemctl status docker
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-04-02 14:34:04 CST; 3 weeks 4 days ago
     Docs: https://docs.docker.com
 Main PID: 20653 (dockerd)
    Tasks: 63
   Memory: 241.8M
   CGroup: /system.slice/docker.service
           └─20653 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

> systemctl start kubelet
> systemctl status kubelet
 kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Mon 2021-02-22 14:11:48 CST; 2 months 1 days ago
     Docs: https://kubernetes.io/docs/
 Main PID: 14530 (kubelet)
    Tasks: 20
   Memory: 61.9M
   CGroup: /system.slice/kubelet.service
           └─14530 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubele...

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
> systemctl enable kubelet && systemctl start kubelet
> systemctl enable docker && systemctl start docker

修改使用kubeadm和相关工具安装kubernetes集群配置

> mkdir -p /opt/kubeadm
> cd /opt/kubeadm
> kubeadm config print init-defaults > init.default.yaml
> vi init.default.yaml
# 修改定制镜像仓库地址
# 原地址 k8s.gcr.io
# 新地址 docker.io/dustise
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:
  dnsDomain: cluster.local
  #修改Pod的地址范围 
  #原范围 10.96.0.0/12
  #新的范围 10.96.0.0/14
  serviceSubnet: 10.96.0.0/14

扩展:10.96.241.0/12,这里/12表示子网掩码,我们常见的子网掩码是255.255.255.255。其实这里的255表示0-255,由8个二进制表示2^8个数, 实际255.255.255.255可以表示为11111111.11111111.11111111.11111111。如果从1的个数来算的话我们则可以表示为32。 而这里的12和32其实表示一个意思,不过一点要注意32和12都是从左到右开始排的。12我们可以表示为11111111. 11110000(2^7+2^6+2^5+2^4).00000000.00000000,子网掩码就是255.240(等比公式16(16-1)).0.0。 至于子网掩码的含义,就是子网设置的iP范围,只要子网非0的位置都是子网IP设置的范围。由此我们可以知道10.96.241.0/12的含义了, 10.96.241.0通过二进制表示为00001010.01100000.00000000.00000000。由此可知我们可以设置的最小IP与最大IP范围是 00001010.01100000.00000000.00000000-00001010.01101111.11111111.11111111。就是是10.96.0.1-10.111.255.254(第一个和最后七个不允许选择)。*

将docker镜像托管地址,修改成国内地址,并下载kubernetes的相关镜像

# 修改镜像托管地址
> echo '{"registry-mirrors":["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json
# 下载kubernetes的相关镜像
> kubeadm config images pull --config=init-config.yaml

运行kubeadm init命令安装Master

注意:kubeadm init 安装过程不涉及网络插件CNI的初始化,因此kubeadm init 安装完成不具备网络功能。

> cd /opt/kubeadm
> kubeadm init --config=init-config.yaml
# 安装完成提示下面若干语句
......
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each
as root:
kubeadm join 10.211.55.30:6443--token ah9koe.nvuvz2v60iam0e0d \
--discovery-token-ca-cert-hash
ha256:9ded80601bc7f5568a9a7ece7ee13fd73be193777641054420a080f778b330fc

# 按提示的步骤处理
#创建一个普通用户
> useradd daiyongjun
#给用户分配sudo权限
> visudo  
daiyongjun      ALL=(ALL)       NOPASSWD: ALL

> su daiyongjun
#在master节点安装的最后日志中,需要我们使用创建集群运行的用户
> mkdir -p $HOME/.kube
> sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
> sudo chown $(id -u):$(id -g) $HOME/.kube/config

注意:这里需要注意kubeadm init命令执行完成后的最后几行提示信息,其中包含加入节点的指令(kubeadm join)和所需的Token。

Kubernetes创建单机模式

kubeadm在Master上也安装了kubelet,在默认情况下并不参与工作负载。如果希望安装一个单机模式的Kubernetes环境,则可以执行下面的命令,让Master成为一个Node。

> kubectl taint nodes --all node-role.kubernetes.io/master

安装Node,加入集群

  1. 在Node节点上安装kubeadm和相关工具(同上所有步骤)
  2. 为kubeadm命令生成配置文件,创建文件join-config.yaml(文件内容如下)
> mkdir -p /opt/kubeadm
> cd /opt/kubeadm
> kubeadm config print join-defaults > join-default.yaml
> vi join-default.yaml
apiVersion: kubeadm.k8s.io/v1beta2
caCertPath: /etc/kubernetes/pki/ca.crt
discovery:
  bootstrapToken:
	#apiServerEndpoint的值是Master服务器的地址
    apiServerEndpoint: 10.211.55.30:6443
	#kubeadm init安装Master的最后一行提示信息
    token: ah9koe.nvuvz2v60iam0e0d
    unsafeSkipCAVerification: true
  timeout: 5m0s
  #kubeadm init安装Master的最后一行提示信息
  tlsBootstrapToken: ah9koe.nvuvz2v60iam0e0d
kind: JoinConfiguration
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: dev-hadoop2
  taints: null
  1. 执行kubeadm join命令,将本Node加入集群
> kubeadm join --config=join-config.yaml

......
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

#在Master节点通过命令查看kubernetes集群中的节点
> kubectl get nodes
NAME          STATUS   ROLES                  AGE   VERSION
dev-hadoop1   Ready    control-plane,master   65d   v1.20.4
dev-hadoop2   Ready    <none>                 65d   v1.20.4
dev-hadoop3   Ready    <none>                 65d   v1.20.4
dev-hadoop4   Ready    <none>                 60d   v1.20.4
dev-hadoop5   Ready    <none>                 51d   v1.20.4

安装网络插件

安装网路插件有两种方式

1、安装CNI网络插件

kubeadm的提示安装CNI网络插件

2、安装weave插件 选择weave插件,执行下面的命令即可一键完成安装

> kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.extensions/weave-net created

验证Kubernetes集群是否安装完成

执行下面的命令,验证Kubernetes集群的相关Pod是否都正常创建并运行

> kubectl get pods --all-namespaces

参考文献&学习资源

Kubernetes权威指南 :从Docker到Kubernetes实践全接触(第4版)