Kubernetes的安装
很多读者在学习Kubernetes的路上,被搁浅在了搭建Kubernetes集群这一步,本小节将带领读者手把手搭建一套Kubernetes集群。安装Kubernetes的方法有很多,比较成熟与简便的办法是采用kubeadm来进行安装。如果我们采用二进制的方式安装,会非常的繁琐。
一、环境准备
1、机器配置要求
Kubernetes集群中的机器被划分一个Master节点和一群Worker节点。本套Kubernetes集群需要三台机器,一台安装Master,两台安装Worker。
-
机器环境
- 用作控制平面节点的计算机上至少有2个 CPU。
- 每台机器 2 GB 以上的内存,内存不足时应用会受限制。
- linux内核: linux内核必须是 4 版本以上,否则需要把linux核心进行升级。
- 集群中所有计算机之间具有完全的网络连接。你可以使用公共网络或专用网络。
-
准备3台虚拟机环境,操作系统为CentOS 7。
-
Kubernetes-Master01:此机器用来安装Kubernetes Master的操作环境。
-
Kubernetes-Worker01:此机器用来安装Kubernetes Worker节点的环境。
-
Kubernetes-Worker02:此机器用来安装Kubernetes Worker节点的环境。
-
2、设置主机名
分别在对应机器上执行以下命令,给每一台机器设置主机名:
- hostnamectl set-hostname Kubernetes-Master01
- hostnamectl set-hostname Kubernetes-Worker01
- hostnamectl set-hostname Kubernetes-Worker02
3、修改主机Host
在每台机器上,修改目录/etc下的hosts文件,在hosts文件添加以下内容:
192.168.8.11 Kubernetes-Master01
192.168.8.22 Kubernetes-Worker01
192.168.8.33 Kubernetes-Worker02
4、机器时间同步
通过date命令,校验下三台机器的时间是否正确,如不正确,执行以下命令,修改机器的时区。
timedatectl set-timezone Asia/Shanghai
5、禁用交换分区
关闭swap分区【虚拟内存】并且永久关闭虚拟内存:
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
6、Linux内核参数调整
- 配置参数输出到一个文件中。
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
- 将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
- 手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf
7、安装相关依赖包
在每台机器上执行以下命令:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
yum install -y vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip
yum install -y bind-utils gcc
二、安装Docker
在每台机器上,都安装Docker,具体的安装步骤参照我的另一篇文章:Docker的安装,这里不再赘述。
三、安装kubeadm、kubelet 和 kubectl
为了安装Kubernetes集群,需要在每台机器上安装以下的软件包:
kubeadm:用来初始化集群的指令。kubelet:在集群中的每个节点上用来启动 Pod 和容器等。kubectl:用来与集群通信的命令行工具。
安装Kubernetes的时候,Kubernetes官网给的yum源是packages.cloud.google.com,因为防火墙的原因,国内访问不了。此时可以使用阿里云的yum仓库中的Kubernetes镜像源:mirrors.aliyun.com/kubernetes/…。
在系统中,添加Kubernetes的yum源:
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
- 关闭防火墙:
setenforce 0
- 可以使用如下命令,查看仓库软件支持版本,我们选择安装1.18.6的版本:
yum list kubelet --showduplicates | sort -r
- 指定版本进行部署:
yum -y install kubelet-1.18.6 kubeadm-1.18.6 kubectl-1.18.6
成功安装的提示如下:
已安装:
kubeadm.x86_64 0:1.18.6-0 kubectl.x86_64 0:1.18.6-0 kubelet.x86_64 0:1.18.6-0
作为依赖被安装:
cri-tools.x86_64 0:1.13.0-0 kubernetes-cni.x86_64 0:0.8.7-0 socat.x86_64 0:1.7.3.2-2.el7
完毕!
- 将kubelet设置为开机自启动:
systemctl enable kubelet && systemctl start kubelet
四、Master初始化
在Master节点上执行如下命令,进行主控制平面的初始化:
kubeadm init --kubernetes-version=v1.18.6 --image-repository fvn7v6mj.mirror.aliyuncs.com/mirrorgcrio --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
上面的命令中的参数说明如下:
- kubernetes-version:指定Kubernetes集群的版本。
- image-repository:指定镜像的镜像仓库,这个参数很重要,否则默认会去国外的镜像仓库下载,可能会无法下载。
- pod-network-cidr:指定Kubernetes集群中的Pod的网络地址段。
- service-cidr:指定Kubernetes集群中的Service的网络地址段。
当提示如下信息的时候,表明已经安装成功,同时注意提示中的两类重要信息:
- 按照如下的提示,进行Master节点的初始化。
- 记录提示信息中的,从节点加入集群的命令。
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 192.168.8.11:6443 --token 2nng8k.3pyptvx6p3ryh860 \
--discovery-token-ca-cert-hash sha256:431c932a3dd640368a9d60db994cddf7707c97b45d861ba03f6fbd2cfc1471f0
按照初始步骤中提示的命令,在Master节点上进行以下三步操作:
- 创建目录,保存连接配置缓存,认证文件。
mkdir -p $HOME/.kube
- 拷贝集群管理配置文件。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- 授权给配置文件
sudo chown $(id -u):$(id -g) $HOME/.kube/config
此时,在Master节点上查看Kubernetes集群中的节点运行情况如下,发现节点的运行状态为NotReady,这是因为网络插件还没有安装。
[root@kubernetes-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master01 NotReady master 79s v1.18.6
五、安装网络插件
网络的插件有很多,本文采用flannel插件,先在Master节点上从网络上下载flannel的yml文件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
然后在Master节点上进行安装,安装的提示信息如下:
[root@kubernetes-master01 ~]# kubectl apply -f kube-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
此时,在Master节点上查看Kubernetes集群的节点信息,节点的状态已经变成了Ready状态。
[root@kubernetes-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master01 Ready master 5m1s v1.18.6
六、Worker加入集群
分别在Worker节点上执行加入的命令(在主节点初始化时提示的信息):
kubeadm join 192.168.8.11:6443 --token 2nng8k.3pyptvx6p3ryh860 \
--discovery-token-ca-cert-hash sha256:431c932a3dd640368a9d60db994cddf7707c97b45d861ba03f6fbd2cfc1471f0
Worker节点加入Kubernetes集群成功,提示如下信息:
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集群的信息,可能部分节点为NotReady的状态,节点加入的过程,会需要一点时间。
[root@kubernetes-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master01 Ready master 6m48s v1.18.6
kubernetes-worker01 NotReady <none> 34s v1.18.6
kubernetes-worker02 Ready <none> 34s v1.18.6
再次在Master节点上查看Kubernetes集群的信息,节点都已经加入成功了。
[root@kubernetes-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kubernetes-master01 Ready master 7m21s v1.18.6
kubernetes-worker01 Ready <none> 67s v1.18.6
kubernetes-worker02 Ready <none> 67s v1.18.6
在Master节点上查看节点中的Pod的信息如下,发现里面有很多的Pod,具体的作用,将在下一小节里说明。
[root@kubernetes-master01 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-589b87488-dsmv8 1/1 Running 0 42m
coredns-589b87488-pc8tp 1/1 Running 0 42m
etcd-kubernetes-master01 1/1 Running 0 42m
kube-apiserver-kubernetes-master01 1/1 Running 0 42m
kube-controller-manager-kubernetes-master01 1/1 Running 0 42m
kube-flannel-ds-5w25c 1/1 Running 0 38m
kube-flannel-ds-8m9vv 1/1 Running 0 36m
kube-flannel-ds-j9bbc 1/1 Running 0 36m
kube-proxy-5gddj 1/1 Running 0 42m
kube-proxy-b67l7 1/1 Running 0 36m
kube-proxy-nnstx 1/1 Running 0 36m
kube-scheduler-kubernetes-master01 1/1 Running 0 42m
七、下篇文章预告
Kubernetes已经安装完成了,你们安装成功了,这可是学习Kubernetes的第一个关卡,过不去,无法继续接下来的游戏哦。 我们下一篇文章将要开始分析Kubernetes集群中安装的组件了。