您的位置:首页 > 其它

使用SSL加密与Kubernetes apiServer的通信

2017-05-13 02:53 555 查看
生成CA私钥证书
创建集群的root CA

创建apiServer的私钥服务端证书

创建访问apiServer的各个组件使用的客户端证书

在k8s集群部署CA证书
配置apiServer

配置kubectl

准备context配置文件

配置controllerManagerschedulerproxy访问apiServer的地址

配置controllerManager

配置scheduler

配置kubelet

配置proxy

重启k8s集群

验证集群启动情况

生成CA、私钥、证书

创建集群的root CA

把所有私钥、证书都放到目录/k8s/rsa里;

CA的CommonName不是必须为kube-ca,可以随意指定。

mkdir -p /k8s/rsa
cd /k8s/rsa
openssl genrsa -out ca-key.pem 2048
openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca"


创建apiServer的私钥、服务端证书

创建证书配置文件openssl.cnf,在alt_names里指定所有访问服务时会使用的目标域名和IP;

因为SSL/TLS协议要求服务器地址需与CA签署的服务器证书里的subjectAltName信息一致。

这里配置的最后两个IP分别是clusterIP取值范围里的第一个可用值、master机器的IP。

k8s会自动创建一个service和对应的endpoint,来为集群内的容器提供apiServer服务;

service默认使用第一个可用的clusterIP作为虚拟IP,放置于default名称空间,名称为kubernetes,端口是443;openssl.cnf里的DNS1~4就是从容器里访问这个service时会使用到的域名。

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = localhost
DNS.6 = centos-master
IP.1 = 127.0.0.1
IP.2 = 10.254.0.1
IP.3 = 192.168.137.240


创建私钥与证书

#创建私钥#
openssl genrsa -out apiserver-key.pem 2048
#创建certificate signing request文件apiserver.csr,里面包含的apiserver的公开信息,如:公钥、名称、可访问地址#
openssl req -new -key apiserver-key.pem -out apiserver.csr -subj "/CN=kube-master" -config openssl.cnf
#生成经过CA签署的服务端证书,里面包含服务端信息、CA的公钥,以及经CA私钥加密的服务端信息的hash值#
openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out apiserver.pem -days 9000 -extensions v3_req -extfile openssl.cnf


创建访问apiServer的各个组件使用的客户端证书

controllerManager、scheduler、kubelet、proxy、kubectl都使用这里生成的管理员证书。

客户端证书的CommonName并不需要匹配k8s里的某个account。

cd /k8s/rsa
openssl genrsa -out admin-key.pem 2048
openssl req -new -key admin-key.pem -out admin.csr -subj "/CN=kube-admin"
openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin.pem -days 9000


在k8s集群部署CA、证书

前提是本地已按照官方文档在centos上安装了k8s集群

https://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/

k8s安装包无法从官方源下载时,可改用阿里云提供的源,centos的配置方式详见阿里云提供的help

http://mirrors.aliyun.com

如果是以容器方式运行k8s组件,按此文章进行配置

https://coreos.com/kubernetes/docs/latest/deploy-master.html

配置apiServer

修改参数文件/etc/kubernetes/apiserver

这里监听SSL/TLS的端口是6443;若指定小于1024的端口,有可能会导致启动apiServer失败。

即使不配置–insecure-access、–insecure-port参数,在master机器上,还是会默认开8080端口提供未加密的HTTP服务;不过只能用localhost作为访问地址。

KUBE_API_ARGS="--bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/k8s/rsa/apiserver.pem --tls-private-key-file=/k8s/rsa/apiserver-key.pem --client-ca-file=/k8s/rsa/ca.pem --service-account-key-file=/k8s/rsa/apiserver-key.pem"


配置kubectl

修改kubectl命令行工具默认使用的apiServer地址、集群CA和客户端证书。

kubectl config set-cluster default-cluster --server=https://centos-master:6443 --certificate-authority=/k8s/rsa/ca.pem
kubectl config set-credentials default-admin --certificate-authority=/k8s/rsa/ca.pem --client-key=/k8s/rsa/admin-key.pem --client-certificate=/k8s/rsa/admin.pem
kubectl config set-context default-system --cluster=default-cluster --user=default-admin
kubectl config use-context default-system


准备context配置文件

context是cluster、namespace、user三个信息的集合。

把已为kubectl配置好的context,保存到公共文件,供controllerManager、scheduler、kubelet、proxy在启动参数里引用。

输出kubectl的当前context配置:

kubectl config view


把输出的context配置保存到文件/etc/kubernetes/kube-admin-context.yaml,类似如下内容:

apiVersion: v1
clusters:
- cluster:
certificate-authority: /k8s/rsa/ca.pem
server: https://centos-master:6443 name: default-cluster
contexts:
- context:
cluster: default-cluster
user: default-admin
name: default-context
- context:
cluster: default-cluster
user: default-admin
name: default-system
current-context: default-system
kind: Config
preferences: {}
users:
- name: default-admin
user:
client-certificate: /k8s/rsa/admin.pem
client-key: /k8s/rsa/admin-key.pem


配置controllerManager、scheduler、proxy访问apiServer的地址

修改参数文件/etc/kubernetes/config

KUBE_MASTER="--master=https://centos-master:6443"


配置controllerManager

修改参数文件/etc/kubernetes/controller-manager

KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml --root-ca-file=/k8s/rsa/ca.pem --service-account-private-key-file=/k8s/rsa/apiserver-key.pem"


配置scheduler

修改参数文件/etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"


配置kubelet

修改参数文件/etc/kubernetes/kubelet

其中–pod-infra-container-image是pod通信接口容器在私有仓库的镜像路径。

KUBELET_API_SERVER="--api-servers=https://centos-master:6443"
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml --pod-infra-container-image=centos-master:5000/pause-amd64:3.0"


配置proxy

修改参数文件/etc/kubernetes/proxy

KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"


重启k8s集群

停止node

for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl stop $SERVICES
done


停止master

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do
systemctl stop $SERVICES
done


重启master

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done


重启node

iptables --flush
iptables -tnat --flush

for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done


验证集群启动情况

查看pod

kubectl get nodes
kubectl get deployments --all-namespaces
kubectl get ReplicationController  --all-namespaces
kubectl get DaemonSets  --all-namespaces
kubectl get ReplicaSets --all-namespaces
kubectl get pods --all-namespaces


查看endpoint

kubectl get services  --all-namespaces
kubectl get endpoints  --all-namespaces


如果pod启动异常,使用kubectl describe命令查看pod启动情况;如pod因secret失效而启动失败,则删除每个namespace下的default账户,并删除全部ReplicaSet,使deployment重新分配ReplicaSet和pod。

kubectl delete serviceaccount default -n default
kubectl delete serviceaccount default -n dev
kubectl delete serviceaccount default -n kube-system
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kubernetes
相关文章推荐