Kubernetes是一个开源的生产级容器编制工具,通过Kubernetes可实现自动化部署、扩展和管理容器化的
应用程序。Kubernetes最初由谷歌设计,现在由Cloud Native Computing Foundation(CNCF)维护。
简单理解Kubernetes就是一个Docker的集群管理器,它提供了与Docker Swarm几乎相同的功能。通过使用
Kubernetes,可以将任意数量的容器副本部署到节点集群上。
部署Kubernetes的方法有很多,可以参考以下链接的介绍,这里我们选择通过Kubeadm-dind (Kuberadm)
来部署一个Kubernetes集群。
Picking the Right Solution
Kubernetes架构介绍
Master Node
● kube-API server: 主服务器上公开Kubernetes API的组件。它是Kubernetes控制面板的前端。
● etcd: 存储Kubenetes集群数据的存储库
● kube-scheduler: 运行在主节点上的调度程序,主节点监视新创建的pods,并根据资源可用性在
选择的节点上运行这些pods。
● kube-controller-manager: 它是在负责监视节点和维护pod复制的管理器上运行的控制管理器。
● cloud-controller-manager: 与底层云提供商交互的云控制管理器。
Worker Nodes
● kubelet: 它在所有工作节点上运行,并处理启动pods和容器等任务。
● kube-proxy: 它是一个Kubernetes网络代理,将TCP/UDP传入请求转发到后端容器。
● Container Runtime: 负责运行容器的软件,Kubernetes支持多种runtime,例如:Docker、
rkt、runc。
Addons
插件是实现集群特性的pods和services。Pods可以由部署、复制控制器等进行管理。带有名称空间的addon
对象是在kube-system名称空间(namespace)中创建的。
● DNS:集群DNS是环境中的其他DNS服务器之外的DNS服务器,它为Kubernetes服务提供DNS记录。
Kubernetes启动的容器会自动在DNS搜索中包含此DNS服务器
● Web UI (Dashboard):Dashboard是一个通用的基于web的Kubernetes集群UI。它允许用户对集群中
运行的应用程序以及集群本身进行管理和故障排除。
● Container Resource Monitoring:容器资源监视记录关于中央数据库中容器的一般时间序列指标,
并提供用于浏览该数据的UI。
● Cluster-level Logging:集群级别的日志记录机制负责将容器日志保存到具有搜索/浏览界面的中央
日志存储中。
环境介绍
本次部署采用VMware ESXi虚拟机的型式,三个节点(1个master节点,两个worker节点),所有节点配
置2vCPU,8G RAM,100G硬盘。
Master Node: 172.16.80.118 k8smaster.kclouder.local
Worker Node1: 172.16.80.119 k8snode01.kclouder.local
Wowker Node2: 172.16.80.120 k8snode02.kclouder.local
OS: CentOS 7.5.1804
Kubernetes版本:1.13
Docker版本: 18.06.1-ce
kubeadm版本: 1.13
kubectl版本: 1.13
kubelet版本: 1.13
环境准备(在所有节点上执行)
1,设置hostname和hosts
172.16.80.118 k8smaster.kclouder.local k8smaster
172.16.80.119 k8snode01.kclouder.local k8snode01
172.16.80.120 k8snode02.kclouder.local k8snode02
2,关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3,关闭SELINUX
setenforce 0
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
4,关闭Swap
swapoff –a
sed -i ‘s/.swap./#&/‘ /etc/fstab
5,修改sysctl内核参数
cat <
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
6,配置国内CentOS YUM源
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7\_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
7,配置国内Kubernetes源
cat <
[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
yum clean all && yum makecache
8,安装常用的软件包
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp bash-completion yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools vim libtool-ltdl
9,配置时间同步
yum install chrony –y
systemctl enable chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service
chronyc sources
10,配置ssh免密访问
ssh-keygen
ssh-copy-id “node”
11,以上配置完成以后,重启节点,并验证各节点之间可以ssh免密访问以及可以ping hostname,同时检
查防火墙和SELINUX已经关闭。
安装Docker(在所有节点上执行)
1,设置Docker yum源
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
2,安装Docker CE 18.06.1
yum install -y docker-ce-18.06.1.ce-3.el7
3,配置Docker Daemon
tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://q2hy3fzi.mirror.aliyuncs.com"\],
“graph”: “/tol/docker-data”
}
EOF
4,启动Docker,确认Docker服务正常。
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl status docker
docker –version
安装kubeadm、kubelet、kubectl(在所有节点上执行)
• kubeadm: 部署集群用的命令
• kubelet: 在集群中每台机器上都要运行的组件,负责管理pod、容器的生命周期
• kubectl: 集群管理工具
1,安装工具
yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes
2,启动kubelet
systemctl enable kubelet
systemctl start kubelet
镜像下载(在所有节点上执行)
1,获取镜像列表
kubeadm config images list
2,生成默认kubeadm.conf文件
kubeadm config print init-defaults > kubeadm.conf
3,修改镜像地址,默认为google的镜像仓库地址k8s.gcr.io,国内无法访问,需要把地址修改为国内的,
这里使用阿里云的镜像仓库地址,编辑kubeadm.conf,将imageRepository修改为registry.aliyuncs.com/google_containers。并确认Kubernetes版本是v1.13.0
4,下载镜像
kubeadm config images pull –config kubeadm.conf
5,镜像下载完成后,需要对镜像重新打标签,因为从阿里下载的镜像都是阿里的标签,而kubeadm里面只
认 google的标签,重新打标签后镜像就都带有 k8s.gcr.io 的标识了。
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.13.0 k8s.gcr.io/kube-apiserver:v1.13.0
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.13.0 k8s.gcr.io/kube-controller-manager:v1.13.0
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.13.0 k8s.gcr.io/kube-scheduler:v1.13.0
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.13.0 k8s.gcr.io/kube-proxy:v1.13.0
docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag registry.aliyuncs.com/google_containers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag registry.aliyuncs.com/google_containers/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
6,删除无用镜像,重新打标签后,还需要把带有 registry.aliyuncs.com 标识的镜像删除。
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.13.0
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.13.0
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.13.0
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.13.0
docker rmi registry.aliyuncs.com/google_containers/pause:3.1
docker rmi registry.aliyuncs.com/google_containers/etcd:3.2.24
docker rmi registry.aliyuncs.com/google_containers/coredns:1.2.6
7,查看下载的镜像列表,执行docker images命令,确认所有image的标签都是k8s.gcr.io
部署Master节点(在Master节点上执行)
1,初始化Kubernetes Master,这里我们定义POD的网段为: 192.168.0.0/16,API Server地址为Master
节点的IP地址。
kubeadm init –kubernetes-version=v1.13.0 –pod-network-cidr=192.168.0.0/16 –apiserver-advertise-address=172.16.80.118
2,初始化成功后,如下图,将最后两行内容记录下来,这个后续用来加入Worker节点时使用。
3,执行以下命令配置kubectl,作为普通用户管理集群并在集群上工作。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4,获取pods列表,查看相关状态,可以看到coredns pod处于挂起状态,这是因为还没有部署pod网络。
kubectl get pods –all-namespaces
5,查看集群的健康状态
kubectl get cs
部署Pod网络(在Master节点上执行)
您必须安装pod网络附加组件,以便pod能够彼此通信。网络必须在任何应用程序之前部署。另外,CoreDNS
在安装网络之前不会启动。kubeadm只支持基于容器网络接口(CNI)的网络。如下图支持的Pod网络有
JuniperContrail/TungstenFabric、Calico、Canal、Cilium、Flannel、Kube-router、Romana、
Wave Net等。这里我们选择部署Calico网络,Calico是一个纯三层的方案,其好处是它整合了各种云原生
平台(Docker、Mesos 与 OpenStack 等),每个 Kubernetes 节点上通过 Linux Kernel 现有的 L3
forwarding 功能来实现 vRouter 功能。
1,下载calico 官方镜像,需要下载三个镜像,分别是calico-node:v3.1.4、calico-cni:v3.1.4、calico-typha:v3.1.4
docker pull calico/node:v3.1.4
docker pull calico/cni:v3.1.4
docker pull calico/typha:v3.1.4
2,重新打标签
docker tag calico/node:v3.1.4 quay.io/calico/node:v3.1.4
docker tag calico/cni:v3.1.4 quay.io/calico/cni:v3.1.4
docker tag calico/typha:v3.1.4 quay.io/calico/typha:v3.1.4
3,删除原有镜像
docker rmi calico/node:v3.1.4
docker rmi calico/cni:v3.1.4
docker rmi calico/typha:v3.1.4
4,部署calico
4.1 下载rbac-kdd.yaml文件
curl https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml -O
4.2 执行rbac-kdd.yaml文件
kubectl apply -f rbac-kdd.yaml
4.3 下载calico.yaml文件
curl https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/policy-only/1.7/calico.yaml -O
4.4 配置calico.yaml文件,把ConfigMap 下的 typha_service_name 值由none变成 calico-typha
4.5 设置Deployment,spec下的replicas值设置为1。
4.6 开启bird模式,把CALICO_NETWORKING_BACKEND值设置为bird,这个值是设置BGP网络后端模式。
同时确认CALICO_IPV4POOL_CIDR为我们之前定义的POD网段地址。
5,以上参数设置完毕后,执行下面命令部署calico
kubectl apply -f calico.yaml
6,部署完成后,执行以下命令查看状态,calico-typha处于挂起状态,这是因为还没有在Worker节点上
进行部署安装POD网络。
kubectl get pods –all-namespaces
部署Worker节点(在所有Worker节点上执行)
1,下载镜像
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.13.0
docker pull registry.aliyuncs.com/google_containers/pause:3.1
docker pull calico/node:v3.1.4
docker pull calico/cni:v3.1.4
docker pull calico/typha:v3.1.4
2,重新打标签
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.13.0 k8s.gcr.io/kube-proxy:v1.13.0
docker tag registry.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag calico/node:v3.1.4 quay.io/calico/node:v3.1.4
docker tag calico/cni:v3.1.4 quay.io/calico/cni:v3.1.4
docker tag calico/typha:v3.1.4 quay.io/calico/typha:v3.1.4
3,清理旧镜像
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.13.0
docker rmi registry.aliyuncs.com/google_containers/pause:3.1
docker rmi calico/node:v3.1.4
docker rmi calico/cni:v3.1.4
docker rmi calico/typha:v3.1.4
4,将Worker节点加入集群,在Worker节点上运行在Kubernetes Master初始化时生成的令牌。
kubeadm join 172.16.80.118:6443 –token 67mwe5.oz13w3mn2ez2nr5x –discovery-token-ca-cert-hash sha256:c3901962108a3f9efd78d4746dd95788253b5fd90bf9d0cc27a73b5dd402078c
5,节点加入完成以后,执行命令查看节点状态
kubectl get nodes
6,查看Pod状态
kubectl get pods –all-namespaces
部署Dashboard
1,拉取Dashboard镜像、tag镜像、清理镜像(在所有节点上执行)
docker pull registry.cn-hangzhou.aliyuncs.com/kubernete/kubernetes-dashboard-amd64:v1.10.0
docker tag registry.cn-hangzhou.aliyuncs.com/kubernete/kubernetes-dashboard-amd64:v1.10.0 k8s.gcr.io/kubernetes-dashboard:v1.10.0
docker rmi registry.cn-hangzhou.aliyuncs.com/kubernete/kubernetes-dashboard-amd64:v1.10.0
(以下操作仅在Master节点上执行)
2,下载kubernetes-dashboard.yaml部署文件
curl https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml -O
3,修改部署文件中的image地址,将地址改为kubernetes-dashboard:v1.10.0
4,创建Dashboard Pod
kubectl create -f kubernetes-dashboard.yaml
5,创建完成后,查看Dashboard的POD是否正常启动,如果正常说明安装成功,如图最下面的POD为新创建
的Dashboard Pod。
6,配置外网访问(不配置的话默认只能集群内访问),修改service配置,将type: ClusterIP改成NodePort
kubectl edit service kubernetes-dashboard –namespace=kube-system
7,查看外网访问的端口,这里的外网端口为31130。
kubectl get service –namespace=kube-system
8,创建admin-token.yaml文件,文件内容如下图
vi admin-token.yaml
9,创建dashboard用户
kubectl create -f admin-token.yaml
10,获取登陆token
kubectl describe secret/$(kubectl get secret -nkube-system grep adminawk ‘{print $1}’) -nkube-system
11,验证访问,通过浏览器访问如下地址
https://172.16.80.118:31130
12,认证方式选择令牌,输入刚才获取到的token,即可登陆成功。
13,正常登录后,界面如下,Dashboard Pod创建完成。
14,通过以下命令可查看Dashboard Pod状态
kubectl get deployment kubernetes-dashboard -n kube-system
kubectl –namespace kube-system get pods -o wide
kubectl get services kubernetes-dashboard -n kube-system
netstat -ntlpgrep 31130