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 <<EOF > /etc/sysctl.d/k8s.conf 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 <<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 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 功能。Pod Network Add-on介绍
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 admin|awk '{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 -ntlp|grep 31130
Pingback引用通告: 使用kubeadm部署k8s 1.14.1集群 - 信息大爆炸