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
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常用组件。 如果本文对您有帮助的话,欢迎转发朋友圈或打赏小编。