下载所需要的安装包:
#可能需要FQ,下载server就可以了,里边包含了所有需要的模块wget https://dl.k8s.io/v1.12.7/kubernetes-server-linux-amd64.tar.gz
生成TLS证书
#使用openssl创建CA证书,部署kubernetes服务使用的所需证书如下#根证书公钥与私钥 ca.pem与ca.key#API Server公钥与私钥 apiserver.pem与apiserver.key#集群管理员公钥与私钥 admin.pem与admin.key#节点proxy公钥与私钥 proxy.pem与proxy.key#节点kubelet的公钥与私钥:是通过boostrap响应的方式,在启动kubelet自动会产生, 然后在master通过csr请求,就会产生。
创建根证书
cd /usr/local/src/tls#生成RSA私钥(无加密)openssl genrsa -out ca.key 2048 #生成 RSA 私钥和自签名证书openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.pem -subj "/CN=kubernetes/O=k8s"# 参数说明:-new 指生成证书请求-x509 表示直接输出证书-key 指定私钥文件-days 指定证书过期时间为10000天-out 导出结束后证书文件-subj 输入证书拥有者信息,这里指定 CN 以及 O 的值# 重要的CN以及0关键参数:-subj 设置CN以及0的值很重要,kubernetes会从证书这两个值对应获取相关的用户名以及用户租的值,如下:"CN":Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;"O":Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
apiserver证书生成
master中需要证书如下:根证书公钥(root CA public key, ca.key)、根证书(ca.pem);apiserver证书:apiserver.pem与其私钥apiserver-key.pem1.创建openssl.cnfopenssl示例:[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_names[alt_names]DNS.1 = kubernetesDNS.2 = kubernetes.defaultDNS.3 = kubernetes.default.svcDNS.4 = kubernetes.default.svc.cluster.localIP.1 = ${K8S_SERVICE_IP}IP.2 = ${MASTER_IPV4}[^_^]:使用有API被访问的Master的IP地址替换${MASTER_IPV4},说白了就是apiserver所在的地址,使用自己规划作为kubernetes service IP端的首IP替换${K8S_SERVICE_IP}如:一般以10.100.0.0/16作为service的服务IP端,则此处以10.100.0.1替换${K8S_SERVICE_IP}如果在高可用配置中部署多个Master节点,需要添加更多的TLS subjectAltNames (SANs)。每个证书合适的SANs配置依赖于从节点与kubectl用户是怎样与Master节点通讯的:直接通过IP地址、通过负载均衡、或者通过解析DNS名称。DNS.5 = ${MASTER_DNS_NAME}IP.3 = ${MASTER_IP}IP.4 = ${MASTER_LOADBALANCER_IP}从节点将通过${MASTER_DNS_NAME}访问到Loadbalancer。根据上面的示例创建openssl的cnf文件vim openssl.cnf [req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_names[alt_names]DNS.1 = kubernetesDNS.2 = kubernetes.defaultDNS.3 = kubernetes.default.svcDNS.4 = kubernetes.default.svc.clusterDNS.5 = kubernetes.default.svc.cluster.localDNS.6 = k8s_masterIP.1 = 10.10.10.1 # ClusterServiceIP 地址IP.2 = 172.16.1.168 # master IP地址IP.3 = 10.10.11.1 # docker IP地址IP.4 = 10.10.10.1 # kubernetes DNS IP地址说明:ClusterServiceIP和kubernetes DNS IP地址 需要在同一个网段,除了masterIP是你查看的,其他IP是需要提前规划的#生成apiserver 证书对openssl genrsa -out apiserver.key 2048openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kubernetes/O=k8s" -config openssl.cnfopenssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out apiserver.pem -days 3650 -extensions v3_req -extfile openssl.cnf一般生成的根证书(ca.key, ca.pem)与apiserver证书(apiserver.key,apiserver.pem)放置在Master节点的/etc/kubernetes/kubernetesTLS/路径下(这个路径是可以自定义修改的,不一定要用我这个)
证书配置相关说明
apiserver的配置中需要指定如下参数## Kubernetes的访问证书配置:--token-auth-file=/etc/kubernetes/token.csv --tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem --tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key --client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem --service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key ## Etcd的访问证书配置:--storage-backend=etcd3 --etcd-cafile=/etc/etcd/etcdSSL/ca.pem --etcd-certfile=/etc/etcd/etcdSSL/etcd.pem --etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem controller-manager的配置中需要指定如下参数:## Kubernetes的访问证书配置:--cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem --cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key --service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key --root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem
admin集群管理员证书生成
## 此证书用于kubectl,设置方式如下:openssl genrsa -out admin.key 2048openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out admin.pem -days 3650说明:由于后续 kube-apiserver 在启用RBAC模式之后, 客户端(如 kubelet、kube-proxy、Pod)请求进行授权的时候会需要认证用户名、以及用户组;那么所谓的用户名和用户组从哪里来定义呢?我们来看看上面openssl创建证书的语句:openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=system:masters/OU=System"其中这里的/CN=admin/O=system:masters/OU=System就是在CN定义用户为admin,O定义用户组为system:masters,OU 指定该证书的 Group 为 system:masters。那么定义好之后,在kubernetes中是怎么使用的呢?kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings(角色),如 cluster-admin (角色)将 Group(组) system:masters与 Role(角色) cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;那么当然的,我们创建admin的证书的时候,就要按照该上面的说明定义好证书的组、用户。另外当kubelet使用该证书访问kube-apiserver是什么样的过程呢?在证书的签名中,OU 指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;同理,如果你是使用CFSSL来签名证书也需要这样去配置好用户和用户组。在这里就不单独写CFSSL签kubernetes的相关证书了。重要的是要好好理解证书签名与kubernetes的RBAC角色绑定的关系。
节点proxy证书生成
openssl genrsa -out proxy.key 2048openssl req -new -key proxy.key -out proxy.csr -subj "/CN=system:kube-proxy"openssl x509 -req -in proxy.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out proxy.pem -days 3650说明:从上面解析说明admin的CN签名与kubernetes角色绑定的关系中,这里简单一眼就看出CN是拿来定义proxy的用户的。CN 指定该证书的请求 User(用户) 为 system:kube-proxy;在kubernetes的RABC默认角色绑定中,kube-apiserver 预定义的 RoleBinding cluster-admin将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;
将生成的ca证书拷贝至准备部署的指定目录
mkdir /etc/kubernetes/kubernetesTLScp admin.key admin.pem apiserver.key apiserver.pem ca.key ca.pem proxy.key proxy.pem /etc/kubernetes/kubernetesTLS/ll /etc/kubernetes/kubernetesTLS/-rw-r--r--. 1 root root 1675 6月 20 14:55 admin.key-rw-r--r--. 1 root root 1050 6月 20 14:55 admin.pem-rw-r--r--. 1 root root 1675 6月 20 14:55 apiserver.key-rw-r--r--. 1 root root 1302 6月 20 14:55 apiserver.pem-rw-r--r--. 1 root root 1679 6月 20 14:55 ca.key-rw-r--r--. 1 root root 1135 6月 20 14:55 ca.pem-rw-r--r--. 1 root root 1675 6月 20 14:56 proxy.key-rw-r--r--. 1 root root 1009 6月 20 14:56 proxy.pem以上就是部署master节点所需要的证书文件了
部署master
将master所需的二进制执行文件拷贝至/user/bin目录下解压刚开始下载的server那个tar包cp kube-apiserver kube-scheduler kube-controller-manager kubectl /usr/bin/#API Server权限控制方式介绍API Server权限控制分为三种:Authentication(身份认证)、Authorization(授权)、AdmissionControl(准入控制)。身份认证:当客户端向Kubernetes非只读端口发起API请求时,Kubernetes通过三种方式来认证用户的合法性。kubernetes中,验证用户是否有权限操作api的方式有三种:证书认证,token认证,基本信息认证。① 证书认证设置apiserver的启动参数:--client_ca_file=SOMEFILE ,这个被引用的文件中包含的验证client的证书,如果被验证通过,那么这个验证记录中的主体对象将会作为请求的username。② Token认证(本次使用token认证的方式)设置apiserver的启动参数:--token_auth_file=SOMEFILE。 token file的格式包含三列:token,username,userid。当使用token作为验证方式时,在对apiserver的http请求中,增加 一个Header字段:Authorization ,将它的值设置为:Bearer SOMETOKEN。③ 基本信息认证设置apiserver的启动参数:--basic_auth_file=SOMEFILE,如果更改了文件中的密码,只有重新启动apiserver使 其重新生效。其文件的基本格式包含三列:password,username,userid。当使用此作为认证方式时,在对apiserver的http 请求中,增加一个Header字段:Authorization,将它的值设置为: Basic BASE64ENCODEDUSER:PASSWORD。#创建 TLS Bootstrapping TokenToken auth fileToken可以是任意的包涵128 bit的字符串,可以使用安全的随机数发生器生成。vim create_token.sh#!/bin/bashbasedir=$(cd `dirname $0`;pwd)## set param BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')## function and implmentsfunction save_BOOTSTRAP_TOKEN(){cat > $configConfDir/BOOTSTRAP_TOKEN < $kubernetesDir/token.csv <
创建admin用户的集群参数
在前面使用openssl创建TLS证书的时候已经对证书的用户以及组签名至证书之中,那么下一步就是定义admin用户在集群中的参数了。vim create_admin.sh#!/bin/bashkubernetesTLSDir=/etc/kubernetes/kubernetesTLS## set param MASTER_IP='172.16.1.168'KUBE_APISERVER="https://$MASTER_IP:6443"# 设置集群参数function config_cluster_param(){ kubectl config set-cluster kubernetes \ --certificate-authority=$kubernetesTLSDir/ca.pem \ --embed-certs=true \ --server=$KUBE_APISERVER}config_cluster_param# 设置管理员认证参数function config_admin_credentials(){ kubectl config set-credentials admin \ --client-certificate=$kubernetesTLSDir/admin.pem \ --client-key=$kubernetesTLSDir/admin.key \ --embed-certs=true}config_admin_credentials# 设置管理员上下文参数function config_admin_context(){ kubectl config set-context kubernetes --cluster=kubernetes --user=admin}config_admin_context# 设置集群默认上下文参数function config_default_context(){ kubectl config use-context kubernetes}config_default_context值得注意的采用token认证的方式,kubernetes在后续是需要创建bootstrap.kubeconfig的文件的,那么我们需要将admin相关的TLS证书文件写入这个bootstrap.kubeconfig文件。该如何将admin的TLS文件参数写入bootstrap.kubeconfig呢?这时候就要借助这个--embed-certs 的参数了,当该参数为 true 时表示将 certificate-authority 证书写入到生成的 bootstrap.kubeconfig文件中。在指定了参数之后,后续由 kube-apiserver 自动生成;
安装kube-apiserver
编写kube-apiserver.service(/usr/lib/systemd/system)vim /usr/lib/systemd/system/kube-apiserver.service[Unit]Description=Kube-apiserver ServiceDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.target[Service]Type=notifyEnvironmentFile=-/etc/kubernetes/configEnvironmentFile=-/etc/kubernetes/apiserverExecStart=/usr/bin/kube-apiserver \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_ETCD_SERVERS \ $KUBE_API_ADDRESS \ $KUBE_API_PORT \ $KUBELET_PORT \ $KUBE_ALLOW_PRIV \ $KUBE_SERVICE_ADDRESSES \ $KUBE_ADMISSION_CONTROL \ $KUBE_API_ARGSRestart=alwaysLimitNOFILE=65536[Install]WantedBy=default.target#设置configvim /etc/kubernetes/config#### kubernetes system config## The following values are used to configure various aspects of all# kubernetes services, including## kube-apiserver.service# kube-controller-manager.service# kube-scheduler.service# kubelet.service# kube-proxy.service# logging to stderr means we get it in the systemd journal# 表示错误日志记录到文件还是输出到stderr。KUBE_LOGTOSTDERR="--logtostderr=true"# journal message level, 0 is debug# 日志等级。设置0则是debug等级KUBE_LOG_LEVEL="--v=0"# Should this cluster be allowed to run privileged docker containers# 允许运行特权容器。KUBE_ALLOW_PRIV="--allow-privileged=true"# How the controller-manager, scheduler, and proxy find the apiserver# 设置master服务器的访问KUBE_MASTER="--master=http://172.16.1.168:8080"#设置apiservervim /etc/kubernetes/apiserver##### kubernetes system config#### The following values are used to configure the kube-apiserver##### The address on the local server to listen to.KUBE_API_ADDRESS="--advertise-address=172.16.1.168 --bind-address=172.16.1.168 --insecure-bind-address=172.16.1.168"### The port on the local server to listen on.#KUBE_API_PORT="--port=8080"### Port minions listen on#KUBELET_PORT="--kubelet-port=10250"### Comma separated list of nodes in the etcd clusterKUBE_ETCD_SERVERS="--etcd-servers=https://172.16.1.168:2379"### Address range to use for services#services负载均衡的ip分配#cat /root/openssl/openssl.cnf中第一个ip 就是该网段内KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.10.10.0/24"### default admission control policiesKUBE_ADMISSION_CONTROL="--admission-control=ServiceAccount,NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota,NodeRestriction"## Add your own!KUBE_API_ARGS="--authorization-mode=Node,RBAC \--kubelet-https=true \--token-auth-file=/etc/kubernetes/token.csv \--service-node-port-range=30000-52767 \--tls-cert-file=/etc/kubernetes/kubernetesTLS/apiserver.pem \--tls-private-key-file=/etc/kubernetes/kubernetesTLS/apiserver.key \--client-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem \--service-account-key-file=/etc/kubernetes/kubernetesTLS/ca.key \--etcd-cafile=/etc/etcd/etcdSSL/ca.pem \--etcd-certfile=/etc/etcd/etcdSSL/etcd.pem \--etcd-keyfile=/etc/etcd/etcdSSL/etcd-key.pem"参数说明--authorization-mode=Node,RBAC启用Node RBAC插件--runtime-config=rbac.authorization.k8s.io/v1beta1运行的rabc配置文件--kubelet-https=true启用https--token-auth-file=$kubernetesDir/token.csv指定生成token文件--service-node-port-range=30000-32767设置node port端口号范围30000~32767--tls-cert-file=$kubernetesTLSDir/apiserver.pem指定apiserver的tls公钥证书--tls-private-key-file=$kubernetesTLSDir/apiserver.key指定apiserver的tls私钥证书--client-ca-file=$kubernetesTLSDir/ca.pem指定TLS证书的ca根证书公钥--service-account-key-file=$kubernetesTLSDir/ca.key指定apiserver的tls证书--storage-backend=etcd3指定etcd存储为version 3系列--etcd-cafile=$etcdCaPem指定etcd访问的ca根证书公钥--etcd-certfile=$etcdPem指定etcd访问的TLS证书公钥--etcd-keyfile=$etcdKeyPem指定etcd访问的TLS证书私钥--enable-swagger-ui=true启用 swagger-ui 功能,Kubernetes使用了swagger-ui提供API在线查询功能--apiserver-count=3设置集群中运行的API Sever数量,这种使用单个也没关系--event-ttl=1hAPI Server 对于各种审计时间保存1小时#启动apisystemctl daemon-reloadsystemctl enable kube-apiserversystemctl start kube-apiserversystemctl status kube-apiserver#发现有报错Apr 27 02:07:34 k8s-master kube-apiserver[13217]: E0427 02:07:34.984980 13217 repair.go:171] the cluster IP 10.0.6.1 for service kubernetes/default is not within the service CIDR 10.244.6.0/24; please recreate#解决方案如果中途修改过--service-cluster-ip-range地址,则必须将default命名空间的kubernetes的service给删除,使用命令:kubectl delete service kubernetes,然后系统会自动用新的ip重建这个service,不然apiserver的log有报错the cluster IP x.x.x.x for service kubernetes/default is not within the service CIDR x.x.x.x/16; please recreatekubectl delete servicesystemctl restart kube-apiserversystemctl status kube-apiserver#查看没有报错了
安装kube-controller-manager
vim /usr/lib/systemd/system/kube-controller-manager.service[Unit]Description=Kube-controller-manager ServiceDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=network.targetAfter=kube-apiserver.serviceRequires=kube-apiserver.service[Service]Type=simpleEnvironmentFile=-/etc/kubernetes/configEnvironmentFile=-/etc/kubernetes/controller-managerExecStart=/usr/bin/kube-controller-manager \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_CONTROLLER_MANAGER_ARGSRestart=alwaysLimitNOFILE=65536[Install]WantedBy=default.targetvim /etc/kubernetes/controller-manager #### The following values are used to configure the kubernetes controller-manager# defaults from config and apiserver should be adequate# Add your own!KUBE_CONTROLLER_MANAGER_ARGS="--master=http://172.16.1.168:8080 \--address=127.0.0.1 \--service-cluster-ip-range=10.10.10.0/24 \--cluster-name=kubernetes \--cluster-signing-cert-file=/etc/kubernetes/kubernetesTLS/ca.pem \--cluster-signing-key-file=/etc/kubernetes/kubernetesTLS/ca.key \--service-account-private-key-file=/etc/kubernetes/kubernetesTLS/ca.key \--root-ca-file=/etc/kubernetes/kubernetesTLS/ca.pem \--leader-elect=true \--experimental-cluster-signing-duration=87600h0m0s"#证书有效期10年#参数说明master=http://172.16.5.81:8080配置master访问地址--address=127.0.0.1配置监听本地IP地址,address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台机器--service-cluster-ip-range=10.0.6.0/24设置kubernetes的service的网段--cluster-name=kubernetes设置集群的域名为kubernetes--cluster-signing-cert-file=$kubernetesTLSDir/ca.pem设置集群签署TLS的ca根证书公钥 。指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥;--cluster-signing-key-file=$kubernetesTLSDir/ca.key设置集群签署TLS的ca根证书私钥 ;指定的证书和私钥文件用来签名为 TLS BootStrap 创建的证书和私钥;--service-account-private-key-file=$kubernetesTLSDir/ca.key设置集群安全账号签署TLS的ca根证书私钥--root-ca-file=$kubernetesTLSDir/ca.pem设置集群root用户签署TLS的ca根证书公钥;用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件;--leader-elect=true设置启动选举,但是目前只启动一个,也没地方要选择,主要在于API Sever有多个的时候--cluster-cidr=$podClusterIP设置集群pod的IP网段#启动controller-managersystemctl daemon-reloadsystemctl enable kube-controller-managersystemctl start kube-controller-managersystemctl status kube-controller-manager
安装kube-scheduler
vim /usr/lib/systemd/system/kube-scheduler.service[Unit]Description=Kube-scheduler ServiceAfter=network.target[Service]Type=simpleEnvironmentFile=-/etc/kubernetes/configEnvironmentFile=-/etc/kubernetes/schedulerExecStart=/usr/bin/kube-scheduler \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_SCHEDULER_ARGSRestart=alwaysLimitNOFILE=65536[Install]WantedBy=default.targetvim /etc/kubernetes/scheduler#### The following values are used to configure the kubernetes scheduler# defaults from config and scheduler should be adequate# Add your own!KUBE_SCHEDULER_ARGS="--master=http://172.16.1.168:8080 --leader-elect=true --address=127.0.0.1"#参数说明--master=http://172.16.5.81:8080定义配置master的apiserver访问地址--leader-elect=true设置启动选举,但是目前只启动一个,也没地方要选择,主要在于API Sever有多个的时候--address=127.0.0.1配置监听本地IP地址,address 值必须为 127.0.0.1,因为当前 kube-apiserver 期望 scheduler 和 controller-manager 在同一台机器#启动schedulersystemctl daemon-reloadsystemctl enable kube-schedulersystemctl restart kube-schedulersystemctl status kube-scheduler
查看集群健康
kubectl get cs
创建 kube-proxy kubeconfig 文件以及相关集群参数
cat create_kubeconfig_file.sh #!/bin/bashbasedir=$(cd `dirname $0`;pwd)serviceDir=/usr/lib/systemd/systembinDir=/usr/binkubernetesDir=/etc/kuberneteskubernetesTLSDir=/etc/kubernetes/kubernetesTLSconfigdir=$basedir/configDirconfigServiceDir=$configdir/serviceconfigConfDir=$configdir/conf## set param MASTER_IP='172.16.1.168'BOOTSTRAP_TOKEN=7d4b6fad6efc458d77a11113fa625c88#echo $BOOTSTRAP_TOKEN## function and implments# set proxyfunction create_proxy_kubeconfig(){ kubectl config set-cluster kubernetes \ --certificate-authority=$kubernetesTLSDir/ca.pem \ --embed-certs=true \ --server=https://$MASTER_IP:6443 \ --kubeconfig=$kubernetesDir/kube-proxy.kubeconfig}create_proxy_kubeconfigfunction config_proxy_credentials(){ kubectl config set-credentials kube-proxy \ --client-certificate=$kubernetesTLSDir/proxy.pem \ --client-key=$kubernetesTLSDir/proxy.key \ --embed-certs=true \ --kubeconfig=$kubernetesDir/kube-proxy.kubeconfig}config_proxy_credentialsfunction config_proxy_context(){ kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=$kubernetesDir/kube-proxy.kubeconfig}config_proxy_contextfunction set_proxy_context(){ kubectl config use-context default --kubeconfig=$kubernetesDir/kube-proxy.kubeconfig}set_proxy_context## set bootstrappingfunction create_kubelet_bootstrapping_kubeconfig(){ kubectl config set-cluster kubernetes \ --certificate-authority=$kubernetesTLSDir/ca.pem \ --embed-certs=true \ --server=https://$MASTER_IP:6443 \ --kubeconfig=$kubernetesDir/bootstrap.kubeconfig}create_kubelet_bootstrapping_kubeconfigfunction config_kubelet_bootstrapping_credentials(){ kubectl config set-credentials kubelet-bootstrap \ --token=$BOOTSTRAP_TOKEN \ --kubeconfig=$kubernetesDir/bootstrap.kubeconfig}config_kubelet_bootstrapping_credentialsfunction config_kubernetes_bootstrap_kubeconfig(){ kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=$kubernetesDir/bootstrap.kubeconfig}config_kubernetes_bootstrap_kubeconfigfunction set_bootstrap_context(){ kubectl config use-context default \ --kubeconfig=$kubernetesDir/bootstrap.kubeconfig}set_bootstrap_context## create rolebindingfunction create_cluster_rolebinding(){ kubectl create --insecure-skip-tls-verify clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap}create_cluster_rolebinding#查看生成的内容cat /etc/kubernetes/kube-proxy.kubeconfigcat /etc/kubernetes/bootstrap.kubeconfig
将所需文件拷贝到node节点上面
确认后续master需要拷贝到node的相关证书文件因为node部署的时候,proxy和kubelet是需要拷贝上面生成的证书以及kubeconfig文件的,这里罗列如下:[root@k8s-master ~]# tree /etc/kubernetes//etc/kubernetes/├── apiserver├── bootstrap.kubeconfig├── config├── controller-manager├── kube-proxy.kubeconfig├── kubernetesTLS│ ├── admin.key│ ├── admin.pem│ ├── apiserver.key│ ├── apiserver.pem│ ├── ca.key│ ├── ca.pem│ ├── proxy.key│ └── proxy.pem├── scheduler└── token.csv
部署Node节点服务(记得关闭防火墙、swap、selinux)
#拷贝Master节点创建的TLS以及kubeconfig文件至Node节点服务scp -r -i /root/.ssh/all_Server_key /etc/kubernetes/ root@172.16.1.167:/etc/scp -r -i /root/.ssh/all_Server_key /etc/kubernetes/ root@172.16.1.166:/etc/#拷贝访问etcd集群的TLS证书文件至Node节点服务 scp -r -i /root/.ssh/all_Server_key /etc/etcd/ root@172.16.1.167:/etc/ scp -r -i /root/.ssh/all_Server_key /etc/etcd/ root@172.16.1.166:/etc/因为每台Node都需要访问Etcd集群服务,在后面部署Calico或者flanneld网络的时候都是需要证书访问etcd集群的,该部分就会在后面的部署中说明了。可是,如果新增一台服务器想要加入Node的话,这时候该台服务器就需要单独将证书拷贝至相应的文件目录了。#拷贝二进制可执行文件至Node服务器(/usr/bin)scp -i /root/.ssh/all_Server_key kubelet kubectl kube-proxy 172.16.1.166:/usr/bin/scp -i /root/.ssh/all_Server_key kubelet kubectl kube-proxy 172.16.1.167:/usr/bin/
部署kubelet服务
vim /usr/lib/systemd/system/kubelet.service[Unit]Description=Kubernetes Kubelet ServerDocumentation=https://github.com/GoogleCloudPlatform/kubernetesAfter=docker.serviceRequires=docker.service[Service]EnvironmentFile=-/etc/kubernetes/configEnvironmentFile=-/etc/kubernetes/kubeletExecStart=/usr/bin/kubelet \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBELET_CONFIG\ $KUBELET_ADDRESS \ $KUBELET_PORT \ $KUBELET_HOSTNAME \ $KUBELET_POD_INFRA_CONTAINER \ $KUBELET_ARGSRestart=on-failure[Install]WantedBy=multi-user.targetvim /etc/kubernetes/kubelet##### kubernetes kubelet (minion) config### The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)#KUBELET_ADDRESS="--address=0.0.0.0"### The port for the info server to serve on#KUBELET_PORT="--port=10250"### You may leave this blank to use the actual hostname#这个ip改成node本机ipKUBELET_HOSTNAME="--hostname-override=172.16.1.167"### location of the api-serverKUBELET_CONFIG="--kubeconfig=/etc/kubernetes/kubelet.kubeconfig"### pod infrastructure containerKUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=reg.kt007.com/library/pause-amd64:3.1"### Add your own!KUBELET_ARGS="--cluster-dns=10.10.10.2 \--serialize-image-pulls=false \--bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \--cert-dir=/etc/kubernetes/kubernetesTLS \--cluster-domain=cluster.local."#参数说明--cluster-dns=10.0.6.200设置kubernetes集群网络中内部DNS的IP地址,后续用于CoreDNS--serialize-image-pulls=false设置kubernetes集群允许使用http非安全镜像拉取--bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig设置bootstrap.kubeconfig的文件路径--cert-dir=/etc/kubernetes/kubernetesTLS设置kubernetes的TLS文件路径,后续kubelet服务启动之后,会在该文件夹自动创建kubelet相关公钥和私钥文件--cluster-domain=cluster.local.设置kubernetes集群的DNS域名--hairpin-mode promiscuous-bridge设置pod桥接网络模式--network-plugin=cni设置启用CNI网络插件,因为后续是使用Calico网络,所以需要配置#启动kubelet服务systemctl daemon-reloadsystemctl enable kubeletsystemctl start kubeletsystemctl status kubelet
部署kube-proxy服务
vim /usr/lib/systemd/system/kube-proxy.service[Unit]Description=Kube Proxy ServiceAfter=network.target[Service]Type=simpleEnvironmentFile=-/etc/kubernetes/configEnvironmentFile=-/etc/kubernetes/proxyExecStart=/usr/bin/kube-proxy \ $KUBE_LOGTOSTDERR \ $KUBE_LOG_LEVEL \ $KUBE_MASTER \ $KUBE_PROXY_ARGSRestart=alwaysLimitNOFILE=65536[Install]WantedBy=default.targetvim /etc/kubernetes/proxy#### kubernetes proxy config# defaults from config and proxy should be adequate# Add your own!KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig"systemctl daemon-reloadsystemctl enable kube-proxysystemctl start kube-proxysystemctl status kube-proxy
#ls -l /etc/kubernetes/kubernetesTLS/可以从文件夹中看出,kubelet服务启动之后,自动响应生成了这三个文件:kubelet-client.key.tmp kubelet.crt kubelet.key。如果需要重新部署kubelet服务,那么就需要删除这三个文件即可。不然会提示过期,服务启动异常。另外,可以看到kubelet-client.key.tmp该文件还没有亮色,不可以运行起来,原因是kubelet向apiserver发出CSR认证的请求,此时apiserver还没有认证通过。那么下一步就需要回到master服务认证csr。