)
Kubernetes安装配置指南1、系统要求2、使用kubeadm工具快速安装Kubernetes集群2.1、安装kubeadm和相关工具2.2、kubeadm config2.3、下载Kubernetes的相关镜像2.4、运行kubeadm init命令安装Master2.5、安装Node加入集群2.6、安装网络插件2.7、验证Kubernetes集群是否安装完成1、系统要求Kubernetes系统由一组可执行程序组成用户可以通过GitHub上的Kubernetes项目页下载编译好的二进制包或者下载源代码并编译后进行安装。安装Kubernetes对软件和硬件的系统要求如表所示。Kubernetes需要容器运行时Container RuntimeInterfaceCRI的支持目前官方支持的容器运行时包括Docker、Containerd、CRI-O和frakti。容器运行时CRI的原理详见3.9节的说明。本节以Docker作为容器运行环境推荐版本为Docker CE 18.09。宿主机操作系统以CentOS Linux 7为例使用Systemd系统完成对Kubernetes服务的配置。其他Linux发行版的服务配置请参考相关的系统管理手册。为了便于管理常见的做法是将Kubernetes服务程序配置为Linux系统开机自启动的服务。需要注意的是CentOS Linux 7默认启动了防火墙服务firewalld而Kubernetes的Master与工作Node之间会有大量的网络通信安全的做法是在防火墙上配置各组件需要相互通信的端口号具体要配置的端口号详见2.8 节各服务启动参数中监听的端口号。在安全的内部网络环境中可以关闭防火墙服务# systemctl disable firewalld# systemctl stop firewalld另外建议在主机上禁用SELinux让容器可以读取主机文件系统# setenforce 0或修改系统文件/etc/sysconfig/selinux将SELINUXenforcing修改成SELINUXdisabled然后重启Linux。2、使用kubeadm工具快速安装Kubernetes集群最简单的方法是使用yum install kubernetes命令安装Kubernetes集群但仍需修改各组件的启动参数才能完成对Kubernetes集群的配置整个过程比较复杂也容易出错。Kubernetes从1.4版本开始引入了命令行工具kubeadm致力于简化集群的安装过程并解决Kubernetes集群的高可用问题。在Kubernetes 1.13版本中kubeadm工具进入GA阶段宣称已经为生产环境应用准备就绪。本节先讲解基于kubeadm的安装过程以CentOS 7为例。2.1、安装kubeadm和相关工具首先配置yum源官方yum源的地址为https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。如果无法访问官方yum源的地址则也可以使用国内的一个yum源地址为http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/yum源的配置文件/etc/yum.repos.d/kubernetes.repo的内容如下[kuebrnetes]nameKubernetes Repositorybaseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/enabled1gpgcheck0然后运行yum install命令安装kubeadm和相关工具# yum install -y kubelet kubeadm kubectl --disableexcludeskubernetes运行下面的命令启动Docker服务如果已安装Docker则无须再次启动和kubelet服务并设置为开机自动启动# systemctl enable docker systemctl start docker# systemctl enable kubelet systemctl start kubelet2.2、kubeadm configkubeadm已经进入GA阶段其控制面初始化和加入节点步骤都支持大量的可定制内容因此kubeadm还提供了配置文件功能用于复杂定制。同时kubeadm将配置文件以ConfigMap的形式保存到集群之中便于后续的查询和升级工作。kubeadm config子命令提供了对这一组功能的支持kubeadm config upload from-file由配置文件上传到集群中生成ConfigMap。kubeadm config upload from-flags由配置参数生成ConfigMap。kubeadm config view查看当前集群中的配置值。kubeadm config print init-defaults输出kubeadminit默认参数文件的内容。kubeadm config print join-defaults输出kubeadm join默认参数文件的内容。kubeadm config migrate在新旧版本之间进行配置转换。kubeadm config images list列出所需的镜像列表。kubeadm config images pull拉取镜像到本地。例如执行kubeadm config print init-defaults可以取得默认的初始化参数文件# kubeadm config print init-defaults init.default.yaml对生成的文件进行编辑可以按需生成合适的配置。例如若需要定制镜像仓库的地址以及Pod的地址范围则可以使用如下配置apiVersion:kubeadm.k8s.io/v1beta1kind:ClusterConfigurationimageRepository:docker.io/dustisekubernetesVersion:v1.14.0networking:podSubnet:192.168.0.0/16将上面的内容保存为init-config.yaml备用。2.3、下载Kubernetes的相关镜像为了从国内的镜像托管站点获得镜像加速支持建议修改Docker的配置文件增加Registry Mirror参数将镜像配置写入配置参数中例如echo ‘{“registry-mirrors”:[“https://registry.docker-cn.com”]}’ /etc/docker/daemon.json然后重启Docker服务。使用config images pull子命令下载所需镜像例如# kubeadm config images pull --configinit-config.yaml[config/images]Pulled docker.io/dustise/kube-apiserver:v1.14.0[config/images]Pulled docker.io/dustise/kube-controller-manager:v1.14.0[config/images]Pulled docker.io/dustise/kube-scheduler:v1.14.0[config/images]Pulled docker.io/dustise/kube-proxy:v1.14.0[config/images]Pulled docker.io/dustise/pause:3.1[config/images]Pulled docker.io/dustise/etcd:3.3.10[config/images]Pulled docker.io/dustise/coredns:1.3.1在镜像下载完成之后就可以进行安装了。2.4、运行kubeadm init命令安装Master至此准备工作已就绪执行kubeadm init命令即可一键安装Kubernetes的Master。在开始之前需要注意kubeadm的安装过程不涉及网络插件CNI的初始化因此kubeadm初步安装完成的集群不具备网络功能任何Pod包括自带的CoreDNS都无法正常工作。而网络插件的安装往往对kubeadm init命令的参数有一定的要求。例如安装Calico插件时需要指定–pod-network-cidr192.168.0.0/16详情可参考https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network。接下来使用kubeadm init命令使用前面创建的配置文件进行集群控制面的初始化# kubeadm init --configinit-config.yaml运行后控制台将输出如下内容[init]Using Kubernetes version: v1.14.0......[preflight]Pulling images requiredforsetting up a Kubernetes cluster......[kubelet-start]Activating the kubeletservice......[certs]Using certificateDir folder/etc/kubernetes/pki[certs]Generatingcacertificate and key[certs]Generatingapiservercertificate and key......[kubeconfig]Using kubeconfig folder/etc/kubernetes[kubeconfig]Writingadmin.confkubeconfigfile[kubeconfig]Writingkubelet.confkubeconfigfile......[kubeconfig]Writingscheduler.confkubeconfigfile[control-plane]Using manifest folder/etc/kubernetes/manifests[control-plane]Creating static Pod manifestforkube-apiserver等待一段时间后Kubernetes的Master安装成功显示如下信息[addons]Applied essential addon: CoreDNS[addons]Applied essential addon: kube-proxy 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/.kubesudocp-i/etc/kubernetes/admin.conf$HOME/.kube/configsudochown$(id-u):$(id-g)$HOME/.kube/config You should now deploy a pod network to the cluster. Runkubectl apply -f [podnetwork].yamlwith one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you canjoinany number of worker nodes by running the following on each as root: kubeadmjoin10.211.55.30:6443--token ah9koe.nvuvz2v60iam0e0d\--discovery-token-ca-cert-hash sha256:9ded80601bc7f5568a9a7ece7ee13fd73be193777641054420a080f778b330fc按照提示执行下面的命令复制配置文件到普通用户的home目录下# 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但在集群内还是没有可用的工作Node并缺乏对容器网络的配置。这里需要注意kubeadm init命令执行完成后的最后几行提示信息其中包含加入节点的指令kubeadm join和所需的Token。此时可以用kubectl命令验证在2.2.2节中提到的ConfigMap# kubectl get -n kube-system configmapkubectl get-nkube-system configmap NAME DATA AGE coredns148m extension-apiserver-authentication648m kube-proxy248m kubeadm-config248m kubelet-config-1.14148m可以看到其中生成了名为kubeadm-config的ConfigMap对象。2.5、安装Node加入集群对于新节点的添加系统准备和Kubernetes yum源的配置过程是一致的在Node主机上执行下面的安装过程。1安装kubeadm和相关工具# yum install kubelet kubeadm --disableexcludeskubernetes运行下面的命令启动Docker服务与kubelet服务并将其设置为开机自启动# systemctl enable docker systemctl start docker# systemctl enable kubelet systemctl start kubelet2为kubeadm命令生成配置文件。创建文件join-config.yaml内容如下apiVersion:kubeadm.k8s.io/v1beta1kind:JoinConfigurationdiscovery:bootstrapToken:apiServerEndpoint:10.211.55.30:6443token:ah9koe.nvuvz2v60iam0e0dunsafeSkipCAVerification:truetlsBootstrapToken:ah9koe.nvuvz2v60iam0e0d其中apiServerEndpoint的值来自Master服务器的地址token和tlsBootstrapToken的值就来自于使用kubeadm init安装Master的最后一行提示信息。3执行kubeadm join命令将本Node加入集群# kubeadm join --configjoin-config.yaml[preflight]Running pre-flight checks......[preflight]Reading configuration from the cluster...[preflight]FYI: You canlookat this configfilewithkubectl -n kube-system get cm kubeadm-config -oyaml[kubelet-start]Downloading configurationforthe kubelet from thekubelet-config-1.14ConfigMapinthe kube-system namespace[kubelet-start]Writing kubelet configuration tofile/var/lib/kubelet/config.yaml[kubelet-start]Writing kubelet environmentfilewith flags tofile/var/lib/kubelet/kubeadm-flags.env[kubelet-start]Activating the kubeletservice[kubelet-start]Waitingforthe kubelet to perform the TLS Bootstrap... Thisnodehas 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. Runkubectl get nodeson the control-plane to see thisnodejointhe cluster.kubeadm在Master上也安装了kubelet在默认情况下并不参与工作负载。如果希望安装一个单机All-In-One的Kubernetes环境则可以执行下面的命令删除Node的Label“node-role.kubernetes.io/master”让Master成为一个Node# kubectl taint nodes --all node-role.kubernetes.io/master-2.6、安装网络插件执行kubectl get nodes命令会发现Kubernetes提示Master为NotReady状态这是因为还没有安装CNI网络插件# kubectl get nodesNAME STATUS ROLES AGE VERSION node-kubeadm-1 NotReady master 67m v1.14.0 node-kubeadm-2 NotReadynone2m9s v1.14.0下面根据kubeadm的提示安装CNI网络插件。对于CNI网络插件可以有许多选择请参考https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network的说明。例如选择weave插件执行下面的命令即可一键完成安装# kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version$(kubectlversion|base64|tr-d\n) serviceaccount/weave-net created clusterrole.rbac.authorization.k8s.io/weave-net created clusterrolebinding.rbac.authorization.k8s.io/weave-net created role.rbac.authorization.k8s.io/weave-net created rolebinding.rbac.authorization.k8s.io/weave-net created daemonset.extensions/weave-net created2.7、验证Kubernetes集群是否安装完成执行下面的命令验证Kubernetes集群的相关Pod是否都正常创建并运行# kubectl get pods --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-7d8f5b649d-2lckr1/1 Running071m kube-system coredns-7d8f5b649d-stssz1/1 Running071m kube-system etcd-node11/1 Running070m kube-system kube-apiserver-node11/1 Running070m kube-system kube-controller-manager-node11/1 Running070m kube-system kube-proxy-tnm4c1/1 Running071m kube-system kube-proxy-xjwgw1/1 Running010m kube-system kube-scheduler-node11/1 Running070m kube-system weave-net-nsfmn2/2 Running061s kube-system weave-net-qfk5x2/2 Running061s如果发现有状态错误的Pod则可以执行kubectl --namespacekube-system describe podpod_name来查看错误原因常见的错误原因是镜像没有下载完成。至此通过kubeadm工具就实现了Kubernetes集群的快速搭建。如果安装失败则可以执行kubeadm reset命令将主机恢复原状重新执行kubeadm init命令再次进行安装。