三、完整集群部署 - kubernetes-with-ca

1. 理解认证授权

1.1 为什么要认证

想理解认证,我们得从认证解决什么问题、防止什么问题的发生入手。
防止什么问题呢?是防止有人入侵你的集群,root你的机器后让我们集群依然安全吗?不是吧,root都到手了,那就为所欲为,防不胜防了。
其实网络安全本身就是为了解决在某些假设成立的条件下如何防范的问题。比如一个非常重要的假设就是两个节点或者ip之间的通讯网络是不可信任的,可能会被第三方窃取,也可能会被第三方篡改。就像我们上学时候给心仪的女孩传纸条,传送的过程可能会被别的同学偷看,甚至内容可能会从我喜欢你修改成我不喜欢你了。当然这种假设不是随便想出来的,而是从网络技术现状和实际发生的问题中发现、总结出来的。kubernetes的认证也是从这个问题出发来实现的。

1.2 概念梳理

为了解决上面说的问题,kubernetes并不需要自己想办法,毕竟是网络安全层面的问题,是每个服务都会遇到的问题,业内也有成熟的方案来解决。这里我们一起了解一下业内方案和相关的概念。

1.3 什么是授权

授权的概念就简单多了,就是什么人具有什么样的权限,一般通过角色作为纽带把他们组合在一起。也就是一个角色一边拥有多种权限,一边拥有多个人。这样就把人和权限建立了一个关系。

2. kubernetes的认证授权

Kubernetes集群的所有操作基本上都是通过kube-apiserver这个组件进行的,它提供HTTP RESTful形式的API供集群内外客户端调用。需要注意的是:认证授权过程只存在HTTPS形式的API中。也就是说,如果客户端使用HTTP连接到kube-apiserver,那么是不会进行认证授权的。所以说,可以这么设置,在集群内部组件间通信使用HTTP,集群外部就使用HTTPS,这样既增加了安全性,也不至于太复杂。
对APIServer的访问要经过的三个步骤,前面两个是认证和授权,第三个是 Admission Control,它也能在一定程度上提高安全性,不过更多是资源管理方面的作用。

2.1 kubernetes的认证

kubernetes提供了多种认证方式,比如客户端证书、静态token、静态密码文件、ServiceAccountTokens等等。你可以同时使用一种或多种认证方式。只要通过任何一个都被认作是认证通过。下面我们就认识几个常见的认证方式。

  • 客户端证书认证 客户端证书认证叫作TLS双向认证,也就是服务器客户端互相验证证书的正确性,在都正确的情况下协调通信加密方案。 为了使用这个方案,api-server需要用--client-ca-file选项来开启。
  • 引导Token 当我们有非常多的node节点时,手动为每个node节点配置TLS认证比较麻烦,这时就可以用到引导token的认证方式,前提是需要在api-server开启 experimental-bootstrap-token-auth 特性,客户端的token信息与预先定义的token匹配认证通过后,自动为node颁发证书。当然引导token是一种机制,可以用到各种场景中。
  • Service Account Tokens 认证 有些情况下,我们希望在pod内部访问api-server,获取集群的信息,甚至对集群进行改动。针对这种情况,kubernetes提供了一种特殊的认证方式:Service Account。 Service Account 和 pod、service、deployment 一样是 kubernetes 集群中的一种资源,用户也可以创建自己的 Service Account。 ServiceAccount 主要包含了三个内容:namespace、Token 和 CA。namespace 指定了 pod 所在的 namespace,CA 用于验证 apiserver 的证书,token 用作身份验证。它们都通过 mount 的方式保存在 pod 的文件系统中。

2.2 kubernetes的授权

在Kubernetes1.6版本中新增角色访问控制机制(Role-Based Access,RBAC)让集群管理员可以针对特定使用者或服务账号的角色,进行更精确的资源访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。 目前 Kubernetes 中有一系列的鉴权机制,因为Kubernetes社区的投入和偏好,相对于其它鉴权机制而言,RBAC是更好的选择。具体RBAC是如何体现在kubernetes系统中的我们会在后面的部署中逐步的深入了解。

2.3 kubernetes的AdmissionControl

AdmissionControl - 准入控制本质上为一段准入代码,在对kubernetes api的请求过程中,顺序为:先经过认证 & 授权,然后执行准入操作,最后对目标对象进行操作。这个准入代码在api-server中,而且必须被编译到二进制文件中才能被执行。 在对集群进行请求时,每个准入控制代码都按照一定顺序执行。如果有一个准入控制拒绝了此次请求,那么整个请求的结果将会立即返回,并提示用户相应的error信息。 常用组件(控制代码)如下:

  • AlwaysAdmit:允许所有请求
  • AlwaysDeny:禁止所有请求,多用于测试环境
  • ServiceAccount:它将serviceAccounts实现了自动化,它会辅助serviceAccount做一些事情,比如如果pod没有serviceAccount属性,它会自动添加一个default,并确保pod的serviceAccount始终存在
  • LimitRanger:他会观察所有的请求,确保没有违反已经定义好的约束条件,这些条件定义在namespace中LimitRange对象中。如果在kubernetes中使用LimitRange对象,则必须使用这个插件。
  • NamespaceExists:它会观察所有的请求,如果请求尝试创建一个不存在的namespace,则这个请求被拒绝。

3. 环境准备

3.1 停止原有kubernetes相关服务

开始之前我们要先把基础版本的集群停掉,包括service,deployments,pods以及运行的所有kubernetes组件

  1. #删除services
  2. $ kubectl delete services nginx-service
  3. #删除deployments
  4. $ kubectl delete deploy kubernetes-bootcamp
  5. $ kubectl delete deploy nginx-deployment
  6. $ kubectl delete service kubernetes-bootcamp
  7. #停掉worker节点的服务
  8. $ service kubelet stop && rm -fr /var/lib/kubelet/*
  9. $ service kube-proxy stop && rm -fr /var/lib/kube-proxy/*
  10. $ service kube-calico stop
  11. #停掉master节点的服务
  12. $ service kube-calico stop
  13. $ service kube-scheduler stop
  14. $ service kube-controller-manager stop
  15. $ service kube-apiserver stop
  16. $ service etcd stop && rm -fr /var/lib/etcd/*

3.2 生成配置(所有节点)

跟基础环境搭建一样,我们需要生成kubernetes-with-ca的所有相关配置文件

  1. $ cd ~/kubernetes-starter
  2. #按照配置文件的提示编辑好配置
  3. $ vi config.properties
  4. #生成配置
  5. $ ./gen-config.sh with-ca

3.3 安装cfssl(所有节点)

cfssl是非常好用的CA工具,我们用它来生成证书和秘钥文件
安装过程比较简单,如下:

  1. #下载
  2. $ wget -q --show-progress --https-only --timestamping \
  3. https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 \
  4. https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  5. #修改为可执行权限
  6. $ chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
  7. #移动到bin目录
  8. $ mv cfssl_linux-amd64 /usr/local/bin/cfssl
  9. $ mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  10. #验证
  11. $ cfssl version

3.4 生成根证书(主节点)

根证书是证书信任链的根,各个组件通讯的前提是有一份大家都信任的证书(根证书),每个人使用的证书都是由这个根证书签发的。

  1. #所有证书相关的东西都放在这
  2. $ mkdir -p /etc/kubernetes/ca
  3. #准备生成证书的配置文件
  4. $ cp ~/kubernetes-starter/target/ca/ca-config.json /etc/kubernetes/ca
  5. $ cp ~/kubernetes-starter/target/ca/ca-csr.json /etc/kubernetes/ca
  6. #生成证书和秘钥
  7. $ cd /etc/kubernetes/ca
  8. $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  9. #生成完成后会有以下文件(我们最终想要的就是ca-key.pem和ca.pem,一个秘钥,一个证书)
  10. $ ls
  11. ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem

4. 改造etcd

4.1 准备证书

etcd节点需要提供给其他服务访问,就要验证其他服务的身份,所以需要一个标识自己监听服务的server证书,当有多个etcd节点的时候也需要client证书与etcd集群其他节点交互,当然也可以client和server使用同一个证书因为它们本质上没有区别。

  1. #etcd证书放在这
  2. $ mkdir -p /etc/kubernetes/ca/etcd
  3. #准备etcd证书配置
  4. $ cp ~/kubernetes-starter/target/ca/etcd/etcd-csr.json /etc/kubernetes/ca/etcd/
  5. $ cd /etc/kubernetes/ca/etcd/
  6. #使用根证书(ca.pem)签发etcd证书
  7. $ cfssl gencert \
  8. -ca=/etc/kubernetes/ca/ca.pem \
  9. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  10. -config=/etc/kubernetes/ca/ca-config.json \
  11. -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
  12. #跟之前类似生成三个文件etcd.csr是个中间证书请求文件,我们最终要的是etcd-key.pem和etcd.pem
  13. $ ls
  14. etcd.csr etcd-csr.json etcd-key.pem etcd.pem

4.2 改造etcd服务

建议大家先比较一下增加认证的etcd配置与原有配置的区别,做到心中有数。 可以使用命令比较:

  1. $ cd ~/kubernetes-starter/
  2. $ vimdiff kubernetes-simple/master-node/etcd.service kubernetes-with-ca/master-node/etcd.service

更新etcd服务:

  1. $ cp ~/kubernetes-starter/target/master-node/etcd.service /lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ service etcd start
  4. #验证etcd服务(endpoints自行替换)
  5. $ ETCDCTL_API=3 etcdctl \
  6. --endpoints=https://10.0.94.112:2379 \
  7. --cacert=/etc/kubernetes/ca/ca.pem \
  8. --cert=/etc/kubernetes/ca/etcd/etcd.pem \
  9. --key=/etc/kubernetes/ca/etcd/etcd-key.pem \
  10. endpoint health

如果直接执行上述命令出现如下错误:

cluster may be unhealthy: failed to list membersError: client: etcd cluster is unavailable or misconfigured; error #0: malformed HTTP response "\x15\x03\x01\x00\x02\x02"; error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused
 

执行export ETCDCTL_ENDPOINT=https://127.0.0.1:2379修改ETCDCTL_ENDPOINT环境变量, 之后再次执行, 则可以看到结果.

5. 改造api-server

5.1 准备证书

  1. #api-server证书放在这,api-server是核心,文件夹叫kubernetes吧,如果想叫apiserver也可以,不过相关的地方都需要修改哦
  2. $ mkdir -p /etc/kubernetes/ca/kubernetes
  3. #准备apiserver证书配置
  4. $ cp ~/kubernetes-starter/target/ca/kubernetes/kubernetes-csr.json /etc/kubernetes/ca/kubernetes/
  5. $ cd /etc/kubernetes/ca/kubernetes/
  6. #使用根证书(ca.pem)签发kubernetes证书
  7. $ cfssl gencert \
  8. -ca=/etc/kubernetes/ca/ca.pem \
  9. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  10. -config=/etc/kubernetes/ca/ca-config.json \
  11. -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
  12. #跟之前类似生成三个文件kubernetes.csr是个中间证书请求文件,我们最终要的是kubernetes-key.pem和kubernetes.pem
  13. $ ls
  14. kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem

5.2 改造api-server服务

查看diff

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/master-node/kube-apiserver.service kubernetes-with-ca/master-node/kube-apiserver.service

生成token认证文件

  1. #生成随机token
  2. $ head -c 16 /dev/urandom | od -An -t x | tr -d ' '
  3. a691e60cc11e7438deb03a91e70ab000
  4. #按照固定格式写入token.csv,注意替换token内容
  5. $ echo "a691e60cc11e7438deb03a91e70ab000,kubelet-bootstrap,10001,\"system:kubelet-bootstrap\""> /etc/kubernetes/ca/kubernetes/token.csv

更新api-server服务

  1. $ cp ~/kubernetes-starter/target/master-node/kube-apiserver.service /lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ service kube-apiserver start
  4. #检查日志
  5. $ journalctl -f -u kube-apiserver

6. 改造controller-manager

controller-manager一般与api-server在同一台机器上,所以可以使用非安全端口与api-server通讯,不需要生成证书和私钥。

6.1 改造controller-manager服务

查看diff

  1. $ cd ~/kubernetes-starter/
  2. $ vimdiff kubernetes-simple/master-node/kube-controller-manager.service kubernetes-with-ca/master-node/kube-controller-manager.service

更新controller-manager服务

  1. $ cp ~/kubernetes-starter/target/master-node/kube-controller-manager.service /lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ service kube-controller-manager start
  4. #检查日志
  5. $ journalctl -f -u kube-controller-manager

7. 改造scheduler

scheduler一般与apiserver在同一台机器上,所以可以使用非安全端口与apiserver通讯。不需要生成证书和私钥。

7.1 改造scheduler服务

查看diff比较会发现两个文件并没有区别,不需要改造

  1. $ cd ~/kubernetes-starter/
  2. $ vimdiff kubernetes-simple/master-node/kube-scheduler.service kubernetes-with-ca/master-node/kube-scheduler.service

启动服务

  1. $ service kube-scheduler start
  2. #检查日志
  3. $ journalctl -f -u kube-scheduler

8. 改造kubectl

8.1 准备证书

  1. #kubectl证书放在这,由于kubectl相当于系统管理员,我们使用admin命名
  2. $ mkdir -p /etc/kubernetes/ca/admin
  3. #准备admin证书配置 - kubectl只需客户端证书,因此证书请求中 hosts 字段可以为空
  4. $ cp ~/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/
  5. $ cd /etc/kubernetes/ca/admin/
  6. #使用根证书(ca.pem)签发admin证书
  7. $ cfssl gencert \
  8. -ca=/etc/kubernetes/ca/ca.pem \
  9. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  10. -config=/etc/kubernetes/ca/ca-config.json \
  11. -profile=kubernetes admin-csr.json | cfssljson -bare admin
  12. #我们最终要的是admin-key.pem和admin.pem
  13. $ ls
  14. admin.csr admin-csr.json admin-key.pem admin.pem

8.2 配置kubectl

  1. #指定apiserver的地址和证书位置(ip自行修改)
  2. $ kubectl config set-cluster kubernetes \
  3. --certificate-authority=/etc/kubernetes/ca/ca.pem \
  4. --embed-certs=true \
  5. --server=https://10.0.94.112:6443
  6. #设置客户端认证参数,指定admin证书和秘钥
  7. $ kubectl config set-credentials admin \
  8. --client-certificate=/etc/kubernetes/ca/admin/admin.pem \
  9. --embed-certs=true \
  10. --client-key=/etc/kubernetes/ca/admin/admin-key.pem
  11. #关联用户和集群
  12. $ kubectl config set-context kubernetes \
  13. --cluster=kubernetes --user=admin
  14. #设置当前上下文
  15. $ kubectl config use-context kubernetes
  16. #设置结果就是一个配置文件,可以看看内容
  17. $ cat ~/.kube/config

验证master节点

  1. #可以使用刚配置好的kubectl查看一下组件状态
  2. $ kubectl get componentstatus
  3. NAME STATUS MESSAGE ERROR
  4. scheduler Healthy ok
  5. controller-manager Healthy ok
  6. etcd-0 Healthy {"health": "true"}

9. 改造calico-node

9.1 准备证书

后续可以看到calico证书用在四个地方:

  • calico/node 这个docker 容器运行时访问 etcd 使用证书
  • cni 配置文件中,cni 插件需要访问 etcd 使用证书
  • calicoctl 操作集群网络时访问 etcd 使用证书
  • calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书
  1. #calico证书放在这
  2. $ mkdir -p /etc/kubernetes/ca/calico
  3. #准备calico证书配置 - calico只需客户端证书,因此证书请求中 hosts 字段可以为空
  4. $ cp ~/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/
  5. $ cd /etc/kubernetes/ca/calico/
  6. #使用根证书(ca.pem)签发calico证书
  7. $ cfssl gencert \
  8. -ca=/etc/kubernetes/ca/ca.pem \
  9. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  10. -config=/etc/kubernetes/ca/ca-config.json \
  11. -profile=kubernetes calico-csr.json | cfssljson -bare calico
  12. #我们最终要的是calico-key.pem和calico.pem
  13. $ ls
  14. calico.csr calico-csr.json calico-key.pem calico.pem

9.2 改造calico服务

查看diff

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/all-node/kube-calico.service kubernetes-with-ca/all-node/kube-calico.service

通过diff会发现,calico多了几个认证相关的文件:
/etc/kubernetes/ca/ca.pem
/etc/kubernetes/ca/calico/calico.pem
/etc/kubernetes/ca/calico/calico-key.pem

scp -r /etc/kubernetes/ca/ root@10.0.94.246:/etc/kubernetes/

由于calico服务是所有节点都需要启动的,大家需要把这几个文件拷贝到每台服务器上

更新calico服务

  1. $ cp ~/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ service kube-calico start
  4. #验证calico(能看到其他节点的列表就对啦)
  5. $ calicoctl node status

10. 改造kubelet

我们这里让kubelet使用引导token的方式认证,所以认证方式跟之前的组件不同,它的证书不是手动生成,而是由工作节点TLS BootStrap 向api-server请求,由主节点的controller-manager 自动签发。

10.1 创建角色绑定(主节点)

引导token的方式要求客户端向api-server发起请求时告诉他你的用户名和token,并且这个用户是具有一个特定的角色:system:node-bootstrapper,所以需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予这个特定角色,然后 kubelet 才有权限发起创建认证请求。在主节点执行下面命令

  1. #可以通过下面命令查询clusterrole列表
  2. $ kubectl -n kube-system get clusterrole
  3. #可以回顾一下token文件的内容
  4. $ cat /etc/kubernetes/ca/kubernetes/token.csv
  5. a691e60cc11e7438deb03a91e70ab000,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
  6. #创建角色绑定(将用户kubelet-bootstrap与角色system:node-bootstrapper绑定)
  7. $ kubectl create clusterrolebinding kubelet-bootstrap \
  8. --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

10.2 创建bootstrap.kubeconfig(工作节点)

这个配置是用来完成bootstrap token认证的,保存了像用户,token等重要的认证信息,这个文件可以借助kubectl命令生成:(也可以自己写配置)

  1. #设置集群参数(注意替换ip)
  2. $ kubectl config set-cluster kubernetes \
  3. --certificate-authority=/etc/kubernetes/ca/ca.pem \
  4. --embed-certs=true \
  5. --server=https://10.0.94.112:6443 \
  6. --kubeconfig=bootstrap.kubeconfig
  7. #设置客户端认证参数(注意替换token)
  8. $ kubectl config set-credentials kubelet-bootstrap \
  9. --token=a691e60cc11e7438deb03a91e70ab000 \
  10. --kubeconfig=bootstrap.kubeconfig
  11. #设置上下文
  12. $ kubectl config set-context default \
  13. --cluster=kubernetes \
  14. --user=kubelet-bootstrap \
  15. --kubeconfig=bootstrap.kubeconfig
  16. #选择上下文
  17. $ kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
  18. #将刚生成的文件移动到合适的位置
  19. $ mv bootstrap.kubeconfig /etc/kubernetes/

10.3 准备cni配置

查看diff

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/worker-node/10-calico.conf kubernetes-with-ca/worker-node/10-calico.conf

copy配置

  1. $ cp ~/kubernetes-starter/target/worker-node/10-calico.conf /etc/cni/net.d/

10.4 改造kubelet服务

查看diff

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/worker-node/kubelet.service kubernetes-with-ca/worker-node/kubelet.service

更新服务

  1. $ cp ~/kubernetes-starter/target/worker-node/kubelet.service /lib/systemd/system/
  2. $ systemctl daemon-reload
  3. $ service kubelet start
  4. #启动kubelet之后到master节点允许worker加入(批准worker的tls证书请求)
  5. #--------*在主节点执行*---------
  6. $ kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve
  7. #-----------------------------
  8. #检查日志
  9. $ journalctl -f -u kubelet

11. 改造kube-proxy

11.1 准备证书

  1. #proxy证书放在这
  2. $ mkdir -p /etc/kubernetes/ca/kube-proxy
  3. #准备proxy证书配置 - proxy只需客户端证书,因此证书请求中 hosts 字段可以为空。
  4. #CN 指定该证书的 User 为 system:kube-proxy,预定义的 ClusterRoleBinding system:node-proxy 将User system:kube-proxy 与 Role system:node-proxier 绑定,授予了调用 kube-api-server proxy的相关 API 的权限
  5. $ cp ~/kubernetes-starter/target/ca/kube-proxy/kube-proxy-csr.json /etc/kubernetes/ca/kube-proxy/
  6. $ cd /etc/kubernetes/ca/kube-proxy/
  7. #使用根证书(ca.pem)签发calico证书
  8. $ cfssl gencert \
  9. -ca=/etc/kubernetes/ca/ca.pem \
  10. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  11. -config=/etc/kubernetes/ca/ca-config.json \
  12. -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
  13. #我们最终要的是kube-proxy-key.pem和kube-proxy.pem
  14. $ ls
  15. kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem

11.2 生成kube-proxy.kubeconfig配置

  1. #设置集群参数(注意替换ip)
  2. $ kubectl config set-cluster kubernetes \
  3. --certificate-authority=/etc/kubernetes/ca/ca.pem \
  4. --embed-certs=true \
  5. --server=https://10.0.94.112:6443 \
  6. --kubeconfig=kube-proxy.kubeconfig
  7. #置客户端认证参数
  8. $ kubectl config set-credentials kube-proxy \
  9. --client-certificate=/etc/kubernetes/ca/kube-proxy/kube-proxy.pem \
  10. --client-key=/etc/kubernetes/ca/kube-proxy/kube-proxy-key.pem \
  11. --embed-certs=true \
  12. --kubeconfig=kube-proxy.kubeconfig
  13. #设置上下文参数
  14. $ kubectl config set-context default \
  15. --cluster=kubernetes \
  16. --user=kube-proxy \
  17. --kubeconfig=kube-proxy.kubeconfig
  18. #选择上下文
  19. $ kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  20. #移动到合适位置
  21. $ mv kube-proxy.kubeconfig /etc/kubernetes/kube-proxy.kubeconfig

11.3 改造kube-proxy服务

查看diff

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/worker-node/kube-proxy.service kubernetes-with-ca/worker-node/kube-proxy.service

经过diff你应该发现kube-proxy.service没有变化

启动服务

  1. #如果之前的配置没有了,可以重新复制一份过去
  2. $ cp ~/kubernetes-starter/target/worker-node/kube-proxy.service /lib/systemd/system/
  3. $ systemctl daemon-reload
  4. #安装依赖软件
  5. $ yum install conntrack -y
  6. #启动服务
  7. $ service kube-proxy start
  8. #查看日志
  9. $ journalctl -f -u kube-proxy

12. 改造kube-dns

kube-dns有些特别,因为它本身是运行在kubernetes集群中,以kubernetes应用的形式运行。所以它的认证授权方式跟之前的组件都不一样。它需要用到service account认证和RBAC授权。
service account认证:
每个service account都会自动生成自己的secret,用于包含一个ca,token和secret,用于跟api-server认证
RBAC授权:
权限、角色和角色绑定都是kubernetes自动创建好的。我们只需要创建一个叫做kube-dns的 ServiceAccount即可,官方现有的配置已经把它包含进去了。

12.1 准备配置文件

我们在官方的基础上添加的变量,生成适合我们集群的配置。直接copy就可以啦

  1. $ cd ~/kubernetes-starter
  2. $ vimdiff kubernetes-simple/services/kube-dns.yaml kubernetes-with-ca/services/kube-dns.yaml

大家可以看到diff只有一处,新的配置没有设定api-server。不访问api-server,它是怎么知道每个服务的cluster ip和pod的endpoints的呢?这就是因为kubernetes在启动每个服务service的时候会以环境变量的方式把所有服务的ip,端口等信息注入进来。

12.2 创建kube-dns

  1. $ kubectl create -f ~/kubernetes-starter/target/services/kube-dns.yaml
  2. #看看启动是否成功
  3. $ kubectl -n kube-system get pods

13. 再试牛刀

终于,安全版的kubernetes集群我们部署完成了。
下面我们使用新集群先温习一下之前学习过的命令,然后再认识一些新的命令,新的参数,新的功能。

k8s1.9.0安装--完整集群部署的更多相关文章

  1. k8s1.9.0安装--基础集群部署

    二.基础集群部署 - kubernetes-simple 1. 部署ETCD(主节点) 1.1 简介 kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运 ...

  2. 初识zookeeper以及安装和集群部署

    初识zookeeper以及安装和集群部署     一.Zookeeper单体版安装     在安装zookeeper之前要先安装jdk环境,具体在linux环境安装jdk1.8请参照linux笔记. ...

  3. redis CentOS6.5安装及集群部署

    .下载redis source包 链接:https://pan.baidu.com/s/122ZCjNvjl9Jx6M2YsLrncw 密码:92ze 2.解压 tar -xzf redis-3.2. ...

  4. kafka单机版的安装、集群部署 及使用

    1.安装kafka(单机版) 1.1上传 kafka_2.11-2.0.0.tgz 到 /root/Downloads 1.2解压 tar 包 tar -zxvf kafka_2.11-2.0.0.t ...

  5. centos7.0 安装redis集群

    生产环境下redis基本上都是用的集群,毕竟单机版随时都可能挂掉,风险太大.这里我就来搭建一个基本的redis集群,功能够用但是还需要完善,当然如果有钱可以去阿里云买云数据库Redis版的,那个还是很 ...

  6. Redis5.0.8 Cluster集群部署

    目录 一.Redis Cluster简介 二.部署 三.创建主库 一.Redis Cluster简介 Redis Cluster集群是一种去中心化的高可用服务,其内置的sentinel功能可以提供高可 ...

  7. Centos7上安装Kubernetes集群部署docker

    一.安装前准备1.操作系统详情需要三台主机,都最小化安装 centos7.3,并update到最新 [root@master ~]# (Core) 角色 主机名 IPMaster master 192 ...

  8. RabbitMQ安装以及集群部署

    本次记录安装RabbitMQ的过程,只针对MAC下单机版安装.单机集群安装方法以及配置haproxy负载均衡. RabbitMQ单机版本安装 RabbitMQ单机集群安装方法(适合开发练习) Rabb ...

  9. Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记

    目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...

随机推荐

  1. 2013年最流行的php框架盘点

    2013年最流行的php框架盘点 PHP框架的发展背景 毫无疑问,Web框架技术在近几年已经得到了突飞猛进的发展和普及,在过去几年里,框架技术的普遍经历了比较大的完善过程,很大一部分可以归因于Ruby ...

  2. modelform组件以及ChoiceField属性

    一. Forms组件补充 1.__init__() 如果继承forms.Form的类中的每一个字段,或者大部分字段都做了相同的约束,可以将该约束放到__init__中编写 实例:每一个字段都需要添加f ...

  3. 如何调整cookie的生命周期

    一.什么是cookie 形象比喻成“网络身份证” 指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). (1)记录信息的盒子(2)识别每一个网络用户的证件 ...

  4. PHP实现图片(文件)上传

    这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯 首先,前端界面 1.表单的首行需要加上enctype="multipart/form-data",需要上传的图片必 ...

  5. java中关于IO流的知识总结(重点介绍文件流的使用)

    今天做软件构造实验一的时候,用到了java文件流的使用,因为之前学的不是很踏实,于是决定今天好好总结一下, 也方便以后的回顾. 首先,要分清IO流中的一些基础划分: 按照数据流的方向不同可以分为:输入 ...

  6. canvas 画布基本操作

    const canvas = document.getElementById('canvas'); // 2.画笔 --- canvas的上下文对象 const ctx = canvas.getCon ...

  7. 还在被大妈灵魂拷问?使用Python轻松完成垃圾分类!

    目录 0 环境 1 引言 2 思路 3 图像分类 4 总结 0 环境 Python版本:3.6.8 系统版本:macOS Mojave Python Jupyter Notebook 1 引言 七月了 ...

  8. Linux文件系统目录结构详解

    在我们初学嵌入式Linux时,首先学习的就是Linux的最小根文件系统:下面我将为初学者们详细的阐述一下Linux的最小根文件系统. 根目录在Linux中即为“/”,要进入根目录,命令“cd  /”即 ...

  9. Qt之股票组件-股票检索--支持预览框、鼠标、键盘操作

    目录 一.感慨一下 二.效果展示 三.搜索编辑框 1.编辑框 2.预览框 四.相关文章 原文链接:Qt之股票组件-股票检索--支持预览框.鼠标.键盘操作 一.感慨一下 之前做过一款炒股软件,个人觉着是 ...

  10. java判断年份是否为闰年

    在t1.jsp 中,设置一个表单,可以输入年份,提交到另外一个action进行计算,如果算出来是闰年,那么就跳转到a1.jsp(显示闰年),如果是平年就跳转到a2.jsp(显示平年). 要求:需要把计 ...