kubeadm快速安装kubernetes v1.14.3 – 第一章

 

使用kubeadm部署Kubernetes1.14集群

  kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践。

自记小屋 https://www.ziji.work
kubernetes进阶交流群: QQ群号:548246072
微信公众号 <自记小屋>

本文使用kubeadm带领大家快速部署Kubernetes v1.13.3版本。

   kubeadm快速的部署一个Kubernetes集群后,学习Kubernetes的使用,然后动手使用二进制的方式来深入理解Kubernetes架构。

注意:请不要把目光仅仅放在部署上,要慢慢的了解其本质。

 

实验环境准备

在本书的实验环境的基础上,我们如下来分配角色:

主机名 IP地址(NAT) 最低配置 描述
linux-master.ziji.work ens33 192.168.187.100 2CPU/2G内存 Kubernetes Master/Etcd节点
linux-node1.ziji.work ens33 192.168.187.101 2CPU/2G内存 Kubernetes Node节点
linux-node2.ziji.work ens33 192.168.187.102 2CPU/2G内存 Kubernetes Node节点
Service 网段 10.100.0.0/16
Pod 网段 10.200.0.0/16

 

1.1 系统配置

在安装之前,需要先做如下准备。三台CentOS 7.6主机如下:

[root@linux-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.187.100 linux-master.ziji.work
192.168.187.101 linux-node1.ziji.work
192.168.187.102 linux-node2.ziji.work

关闭firewalld,禁用Selinux

systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

 

1.2 设置内核参数
[root@linux-node1 ~]# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

> 使配置生效sysctl --system && modprobe br_netfilter

 

1.3 开启ipvs

在所有的Kubernetes节点node1和node2上执行以下脚本:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF


chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

 

1.3 安装Docker
  • 步骤一: 设置国内yum源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  • 骤二: 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2

  由于kubeadm对Docker的版本是有要求的,需要安装与kubeadm匹配的版本。

[root@linux-master ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
* updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
* extras: mirrors.cn99.com
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable

安装Docker18.09版本

[root@linux-master ~]# yum -y install docker-ce-18.09.5-3.el7
  • 步骤三: 启动Docker服务
[root@linux-master ~]# systemctl enable docker && systemctl start docker

[root@linux-master ~]#  docker --version
Docker version 18.09.6, build 481bc77156

修改各个节点上docker的将cgroup driver改为systemd

文档详解 https://kubernetes.io/docs/setup/cri/

mkdir /etc/docker

# Setup daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

mkdir -p /etc/systemd/system/docker.service.d

# Restart Docker
systemctl daemon-reload
systemctl restart docker

 

安装kubeadm

由于国内网络特殊, 我们需要配置国内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
列出kuberentes版本信息
[root@linux-master ~]# yum list |grep kube
cockpit-kubernetes.x86_64                   176-4.el7.centos           extras   
cri-tools.x86_64                            1.12.0-0                   kubernetes
kubeadm.x86_64                              1.14.3-0                   kubernetes
kubectl.x86_64                              1.14.3-0                   kubernetes
kubelet.x86_64                              1.14.3-0                   kubernetes
kubernetes.x86_64                           1.5.2-0.7.git269f928.el7   extras   
kubernetes-client.x86_64                    1.5.2-0.7.git269f928.el7   extras   
kubernetes-cni.x86_64                       0.7.5-0                    kubernetes
kubernetes-master.x86_64                    1.5.2-0.7.git269f928.el7   extras   
kubernetes-node.x86_64                      1.5.2-0.7.git269f928.el7   extras   

 

安装kubeadm kubectl kubelet

Node节点只需要安装kubelet即可

  • 步骤一: Master节点执行如下命令
yum makecache fast
yum install -y kubelet kubeadm kubectl ipvsadm
  • 步骤二: Node节点执行如下命令
yum makecache fast
yum install -y kubelet ipvsadm kubeadm

 

配置kubelet

默认情况下,Kubelet不允许所在的主机存在交换分区,针对已经存在交换分区的可以设置忽略禁止使用Swap的限制,不然无法启动Kubelet。

修改kubelet的配置, 增加–fail-swap-on=false 参数

vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--fail-swap-on=false

 

启动kubelet并设置开机启动
systemctl enable kubelet 
systemctl start kubelet

此时还无法正常启动kubelet , 在master节点执行kubeadm init 初始化集群

kubeadm init \
--kubernetes-version v1.14.3 \
--apiserver-advertise-address=192.168.187.100 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.100.0.0/16 \
--pod-network-cidr=10.200.0.0/16 \
--ignore-preflight-errors=Swap
  • –apiserver-advertise-address:指定用 Master 的哪个IP地址与 Cluster的其他节点通信。
  • –service-cidr:指定Service网络的范围,即负载均衡VIP使用的IP地址段。
  • –pod-network-cidr:指定Pod网络的范围,即Pod的IP地址段。
  • –image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.14版本中我们可以增加-image-repository参数,默认值是 k8s.gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。
  • –kubernetes-version=v1.14.3:指定要安装的版本号。
  • –ignore-preflight-errors=:忽略运行时的错误,例如上面目前存在[ERROR NumCPU]和[ERROR Swap],忽略这两个报错就是增加–ignore-preflight-errors=NumCPU 和–ignore-preflight-errors=Swap的配置即可。

我们还可以增加以下参数定义service访问的域名

--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU

执行完毕后,会在当前输出下停留,等待下载Kubernetes组件的Docker镜像。根据你的网络情况,可以持续1-5分钟,你也可以使用docker images查看下载的镜像。

出现以下内容则表示集群初始化成功

Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  • [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  • [certificates]生成相关的各种证书 ,存放在/etc/kubernetes/pki目录中
  • [kubeconfig]生成相关的kubeconfig文件, 存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。
  • [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  • [control-plane]:使用/etc/kubernetes/manifest目录下的YAML文件,安装 Master 组件。
  • [etcd]:使用/etc/kubernetes/manifest/etcd.yaml安装Etcd服务。
  • [kubelet]:使用configMap配置kubelet。
  • [bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  • [addons]:安装附加组件CoreDNS和kube-proxy

下面的命令是配置kubectl访问集群

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

在该配置文件中,记录了API Server的访问地址,所以后面直接执行kubectl命令就可以正常连接到API Server中。

 

使用kubectl命令查看组件状态
确认个组件都处于healthy状态:
[root@linux-master ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}
在Node节点执行如下命令,加入集群
kubeadm join 192.168.187.100:6443 --token 4xjgz0.xbfpvcffsdgbaoiq \
    --discovery-token-ca-cert-hash \
    sha256:ec9cc6094f0c30131a38cbd7d5ff41abba7a1140ec4188fb89f6f93b689ff927 \
   --ignore-preflight-errors=Swap

 

在master节点执行kubectl查看node节点状态
[root@linux-master ~]# kubectl  get node 
NAME                     STATUS     ROLES    AGE   VERSION
linux-master.ziji.work   NotReady   master   25m   v1.14.3
linux-node1.ziji.work    NotReady   <none>   99s   v1.14.3
linux-node2.ziji.work    NotReady   <none>   15s   v1.14.3

此时status显示NotReady状态, 因为是没有部署网络插件

安装网络插件 Calico

wget https://docs.projectcalico.org/v3.1/getting-started/\
kubernetes/installation/hosted/rbac-kdd.yaml
wget https://docs.projectcalico.org/v3.1/getting-started/\
kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

修改calico.yaml CALICO_IPV4POOL_CIDR值改为Pod的网段10.200.0.0/16

            - name: CALICO_IPV4POOL_CIDR
              value: "10.200.0.0/16"

将calico.yaml image镜像地址替换以下内容

registry.cn-hangzhou.aliyuncs.com/kubernetes-base/node:v3.1.6
registry.cn-hangzhou.aliyuncs.com/kubernetes-base/cni:v3.1.6
registry.cn-hangzhou.aliyuncs.com/kubernetes-base/typha:v3.1.6

执行以下命令

[root@linux-master ~]# ll
total 20
-rw-r--r-- 1 root root 13685 Jun 12 18:03 calico.yaml
-rw-r--r-- 1 root root  1651 Jun 12 17:33 rbac-kdd.yaml

[root@linux-master ~]# kubectl  apply -f rbac-kdd.yaml 
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
[root@linux-master ~]# kubectl  apply -f calico.yaml 
configmap/calico-config created
service/calico-typha created
deployment.apps/calico-typha created
daemonset.extensions/calico-node created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
serviceaccount/calico-node created

等待数分钟后,Calico即运行起来啦。

[root@linux-master ~]# kubectl  get pod --all-namespaces
NAMESPACE     NAME                                             READY   STATUS    RESTARTS   AGE
kube-system   calico-node-cnl2x                                2/2     Running   0          102s
kube-system   calico-node-hwt7v                                2/2     Running   0          101s
kube-system   calico-node-t9mj4                                2/2     Running   0          101s
kube-system   coredns-8686dcc4fd-dwknb                         1/1     Running   0          82m
kube-system   coredns-8686dcc4fd-lm85n                         1/1     Running   0          82m
kube-system   etcd-linux-master.ziji.work                      1/1     Running   0          82m
kube-system   kube-apiserver-linux-master.ziji.work            1/1     Running   0          81m
kube-system   kube-controller-manager-linux-master.ziji.work   1/1     Running   3          82m
kube-system   kube-proxy-4qsdc                                 1/1     Running   0          59m
kube-system   kube-proxy-p47c2                                 1/1     Running   0          57m
kube-system   kube-proxy-t2vdx                                 1/1     Running   0          82m
kube-system   kube-scheduler-linux-master.ziji.work            1/1     Running   3          82m

 

验证集群

  • 为集群Node设置标签
[root@linux-master ~]# kubectl label node  linux-node1.ziji.work node-role.kubernetes.io/node=
node/linux-node1.ziji.work labeled
[root@linux-master ~]# kubectl label node  linux-node2.ziji.work node-role.kubernetes.io/node=
node/linux-node2.ziji.work labeled
  • 检查Node STATUS值是否为Ready
[root@linux-master ~]# kubectl  get node 
NAME                     STATUS   ROLES    AGE   VERSION
linux-master.ziji.work   Ready    master   86m   v1.14.3
linux-node1.ziji.work    Ready    node     62m   v1.14.3
linux-node2.ziji.work    Ready    node     60m   v1.14.3

 

测试DNS

kubectl run curl --image=radial/busyboxplus:curl -it
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-5cc7b478b6-r997p:/ ]$ 

进入后执行nslookup kubernetes.default确认解析正常:

[ root@curl-66bdcf564-mhvxw:/ ]$ nslookup  kubernetes
Server:    10.100.0.10
Address 1: 10.100.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.100.0.1 kubernetes.default.svc.cluster.local

 

测试Kubernetes集群

在上面的步骤中,我们创建了一个Kubernetes集群,1个Master和2个Node节点,在生产环境需要考虑Master的高可用。

  • 创建Pod
[root@linux-master ~]# kubectl  run nginx --image=nginx --replicas=2

root@linux-master ~]# kubectl  get pod -owide 
NAME                     READY   STATUS    RESTARTS   AGE     IP           NODE                    NOMINATED NODE   READINESS GATES
curl-66bdcf564-mhvxw     1/1     Running   0          6m29s   10.200.2.2   linux-node2.ziji.work   <none>           <none>
nginx-7db9fccd9b-sf6rp   1/1     Running   0          3m37s   10.200.1.4   linux-node1.ziji.work   <none>           <none>
nginx-7db9fccd9b-vgtw9   1/1     Running   0          3m37s   10.200.2.3   linux-node2.ziji.work   <none>           <none>
  • 访问Pod应用
[root@linux-master ~]# curl --head http://10.200.2.3
HTTP/1.1 200 OK
Server: nginx/1.17.0
Date: Wed, 12 Jun 2019 10:31:00 GMT
Content-Type: text/html
Content-Length: 22
Last-Modified: Wed, 12 Jun 2019 10:30:05 GMT
Connection: keep-alive
ETag: "5d00d42d-16"
Accept-Ranges: bytes

  • 测试扩容
[root@linux-master ~]# kubectl scale deployment nginx --replicas=3
deployment.extensions/nginx scaled

[root@linux-master ~]# kubectl  get pod
NAME                     READY   STATUS    RESTARTS   AGE
curl-66bdcf564-mhvxw     1/1     Running   0          12m
nginx-7db9fccd9b-n8597   1/1     Running   0          25s
nginx-7db9fccd9b-sf6rp   1/1     Running   0          10m
nginx-7db9fccd9b-vgtw9   1/1     Running   0          10m

为Nginx增加Service,会创建一个Cluster IP,从Master初始化的–service-cidr=10.100.0.0/16地址段中进行分配, 并开启NodePort是在Node节点上进行端口映射,进行外部访问。

[root@linux-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

[root@linux-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.100.0.1     <none>        443/TCP        106m
nginx        NodePort    10.100.95.65   <none>        80:31620/TCP   9s

测试NodePort,外部访问。 http://192.168.187.100:31620

修改kube-proxy为Ipvs模式

在Kubernetes集群中Kube-Proxy组件负载均衡的功能,默认使用iptables,生产环境建议使用ipvs进行负载均衡。

  • 修改kube-proxy configmap配置文件
kubectl edit cm kube-proxy -n kube-system



kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
# ipvs模式
mode: "ipvs"
nodePortAddresses: null
oomScoreAdj: -999

重启各个节点上的kube-proxy pod:

kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

 

kubelet路径详解:

/etc/kubernetes/manifests              # 清单目录
/etc/sysconfig/kubelet                 # 配置文件
/etc/systemd/system/kubelet.service    # unit file
/usr/bin/kubelet                       # 主程序

现在你已经拥有了一个Kubernetes集群,接下来就可以继续探索Kubernetes的世界了。  下一篇将分享如何部署kubernetes ui界面dashborad,以及kubernetes常用组件。 如果本文对您有帮助的话,欢迎转发朋友圈或打赏小编。

 

 

 

发表评论