博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
轻松了解Kubernetes认证功能
阅读量:5889 次
发布时间:2019-06-19

本文共 5819 字,大约阅读时间需要 19 分钟。

简称k8s,是谷歌于2014年开始主导的开源项目,提供了以容器为中心的部署、伸缩和运维平台。截止目前它的最新版本为1.2。搭建环境之前建议先了解一下kubernetes的相关知识,可以参考 系列文章。本文介绍kubernetes的安全性配置。

准备工作

首先需要搭建kubernetes集群环境,可以参考 来安装自己的kubernetes集群,运行到flannel配置完成即可。接下来的api server等设置的参数可以参考本文。

结果应该是有三台虚拟机,一台叫做 master ,它的IP是 192.168.33.17 ,运行 着k8s的api server、controller manager和scheduler;另两台叫做 node1node2 ,它们的IP分别是 192.168.33.18192.168.33.19 ,运行着k8s的kubelet和kube-proxy,当做k8s的两个节点。

部署

最简单的方式就是通过基于CSV的基本认证。首先需要创建api server的基本认证文件:

master

cd ~mkdir securityecho 123456,admin,qinghua > security/basic_auth.csv # 格式:用户名,密码,用户ID

然后就可以生成CA和api server的证书了:

master

cd securityopenssl genrsa -out ca.key 2048openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.33.17" -days 10000 -out ca.crtopenssl genrsa -out server.key 2048openssl req -new -key server.key -subj "/CN=192.168.33.17" -out server.csropenssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000cd ..

上面的命令会生成若干证书相关文件,作用如下:

  • ca.key:自己生成的CA的私钥,用于模拟一个CA
  • ca.crt:用自己的私钥自签名的CA证书
  • server.key:api server的私钥,用于配置api server的https
  • server.csr:api server的证书请求文件,用于请求api server的证书
  • server.crt:用自己模拟的CA签发的api server的证书,用于配置api server的https

接下来启动api server,参数的作用可以参考 :

master

docker run -d \ --name=apiserver \ --net=host \ -v /home/vagrant/security:/security \  gcr.io/google_containers/kube-apiserver:e68c6af15d4672feef7022e94ee4d9af \  kube-apiserver \  --advertise-address=192.168.33.17 \  --admission-control=ServiceAccount \  --insecure-bind-address=0.0.0.0 \  --etcd-servers=http://192.168.33.17:4001 \ --service-cluster-ip-range=11.0.0.0/16 \ --tls-cert-file=/security/server.crt \ --tls-private-key-file=/security/server.key \ --secure-port=443 \ --basic-auth-file=/security/basic_auth.csv

还需要启动controller manager,参数的作用可以参考 :

master

docker run -d \ --name=cm \ -v /home/vagrant/security:/security \ gcr.io/google_containers/kube-controller-manager:b9107c794e0564bf11719dc554213f7b \ kube-controller-manager \ --master=192.168.33.17:8080 \ --cluster-cidr=10.245.0.0/16 \ --allocate-node-cidrs=true \ --root-ca-file=/security/ca.crt \ --service-account-private-key-file=/security/server.key

最后是scheduler,参数的作用可以参考 :

master

docker run -d \ --name=scheduler \ gcr.io/google_containers/kube-scheduler:903b34d5ed7367ec4dddf846675613c9 \ kube-scheduler \ --master=192.168.33.17:8080

可以运行以下命令来确认安全配置已经生效:

master

curl -k -u admin:123456 https://127.0.0.1/ curl -k -u admin:123456 https://127.0.0.1/api/v1

最后启动kubelet和kube-proxy,参数的作用可以参考 和 :

node1 node2

NODE_IP=`ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | cut -d' ' -f1`sudo kubernetes/server/bin/kubelet \ --api-servers=192.168.33.17:8080 \ --cluster-dns=11.0.0.10 \ --cluster-domain=cluster.local \ --hostname-override=$NODE_IP \ --node-ip=$NODE_IP > kubelet.log 2>&1 &sudo kubernetes/server/bin/kube-proxy \ --master=192.168.33.17:8080 \ --hostname-override=$NODE_IP > proxy.log 2>&1 &

验证

如果需要通过https访问,kubectl的命令就略微有点儿麻烦了,需要用 basic_auth.csv 里配置的 admin/123456 来登录:

master

~/kubernetes/server/bin/kubectl -s https://192.168.33.17 --insecure-skip-tls-verify=true --username=admin --password=123456 get po

因为8080端口还开着,所以也可以通过http访问:

master

~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get po

配置完成后,可以看到系统里有TYPE为 kubernetes.io/service-account-token 的秘密:

master

~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get secret

里面有三条数据,分别是 ca.crtnamespacetoken ,可以通过以下命令看到:

master

~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 describe secret

如果你通过kubernetes启动了一个pod,就可以在容器的 /var/run/secrets/kubernetes.io/serviceaccount/ 目录里看到以三个文件的形式看到这三条数据(这是 --admission-control=ServiceAccount 的功劳),当pod需要访问系统服务的时候,就可以使用它们了。可以使用以下命令看到系统的服务账号:

master

~/kubernetes/server/bin/kubectl -s http://192.168.33.17:8080 get serviceAccount

简化kubectl

如果我们通过设置 --insecure-port=0 把api server的http端口关闭,那它就只能通过https访问了:

master

docker rm -f apiserverdocker run -d \ --name=apiserver \ --net=host \ -v /home/vagrant/security:/security \  gcr.io/google_containers/kube-apiserver:e68c6af15d4672feef7022e94ee4d9af \  kube-apiserver \  --advertise-address=192.168.33.17 \  --admission-control=ServiceAccount \  --insecure-bind-address=0.0.0.0 \  --etcd-servers=http://192.168.33.17:4001 \ --service-cluster-ip-range=11.0.0.0/16 \ --tls-cert-file=/security/server.crt \ --tls-private-key-file=/security/server.key \ --secure-port=443 \ --basic-auth-file=/security/basic_auth.csv \ --insecure-port=0

这样的话,就连取个pod都得这么麻烦:

master

~/kubernetes/server/bin/kubectl -s https://192.168.33.17 --insecure-skip-tls-verify=true --username=admin --password=123456 get po

幸运的是,kubernetes提供了一种方式,让我们可以大大简化命令,只用这样就好了:

master

~/kubernetes/server/bin/kubectl get po

下面就让我们来试一下吧!首先用 kubectl config 命令来配置admin用户:

master

~/kubernetes/server/bin/kubectl config set-credentials admin --username=admin --password=123456

然后是api server的访问方式,给集群起个名字叫qinghua:

master

~/kubernetes/server/bin/kubectl config set-cluster qinghua --insecure-skip-tls-verify=true --server=https://192.168.33.17

接下来创建一个context,它连接用户admin和集群qinghua:

master

~/kubernetes/server/bin/kubectl config set-context default/qinghua --user=admin --namespace=default --cluster=qinghua

最后设置一下默认的context:

master

~/kubernetes/server/bin/kubectl config use-context default/qinghua

然后就可以用我们的简化版啦:

master

~/kubernetes/server/bin/kubectl get po

可以通过以下命令来看到当前kubectl的配置:

master

~/kubernetes/server/bin/kubectl config view

能够看到如下内容:

apiVersion: v1 clusters:- cluster: insecure-skip-tls-verify: true server: https://192.168.33.17 name: qinghuacontexts:- context: cluster: qinghua namespace: default user: admin name: default/qinghuacurrent-context: default/qinghua kind: Config preferences: {} users:- name: admin user: password: "123456" username: admin

实际上这些配置都存放在 ~/.kube/config 文件里:

master

cat ~/.kube/config

修改这个文件也可以实时生效。细心的童鞋们可以看到,cluster、context和users都是集合,也就是说如果需要切换用户和集群等,只需要设置默认context就可以了,非常方便。

本文转自掘金-

转载地址:http://mrgix.baihongyu.com/

你可能感兴趣的文章
分页器(自定制)
查看>>
Docker系列一:Docker的介绍和安装
查看>>
java中添加定时任务
查看>>
mysql innodb研究中一直不懂的东西(不断更新)
查看>>
洛谷 P1803 凌乱的yyy Label:Water 贪心
查看>>
3.4 函数式编程
查看>>
测试——设计思维之获取反馈
查看>>
python之 前端HTML/CSS基础知识学习笔记
查看>>
Sencha Touch NestList 如何载入tree结构的数据
查看>>
工具栏图标切换
查看>>
Openlayers系列(一)关于地图投影相关错误的解决方案
查看>>
php多进程中的阻塞与非阻塞
查看>>
TensorFlow学习笔记(五)图像数据处理
查看>>
crossplatform---Nodejs in Visual Studio Code 05.Swig+Bootstrap
查看>>
论JVM爆炸的几种姿势及自救方法---转载
查看>>
keystone 手动建立租户,用户,角色,服务,端口
查看>>
排序之快速排序
查看>>
Win32编程day07 学习笔记
查看>>
PYTHON2.day09
查看>>
PYTHON2.day05
查看>>