[TOC]
## **一、ETCD**
## **二、K8S**
#### **2.1 配置kube-apiserver使用https访问etcd(每个Master节点都要操作)**
编辑`/etc/kubernetes/apiserver`文件,找到如下一行:
```
ETCD_SERVERS="--etcd-servers=http://192.168.92.121:2379,http://192.168.92.122:2379"
```
把http改成https,并且添加`--etcd-keyfile`和`--etcd-certfile`两个参数,最终为:
```
ETCD_SERVERS="--etcd-servers=https://192.168.92.121:2379,https://192.168.92.122:2379 --etcd-keyfile=/etc/kubernetes/key/etcd/peer.key --etcd-certfile=/etc/kubernetes/key/etcd/peer.crt"
```
#### **2.2 重新配置kube-apiserver的服务证书(每个Master节点都要操作)**
*进入到`/etc/kubernetes/key/`目录下,注意2.2小节的命令都是在该目录下执行。*
执行命令,生成kube-apiserver.key
```
$ openssl genrsa -out kube-apiserver.key 4096
```
创建`/etc/kubernetes/key/kube-apiserver.csr.conf`文件,内容如下,文件内容中有几点需要注意:
* `{{vip}}`要替换成k8s集群的vip,注意文件中有两个`{{vip}}`
* `IP.3 = 10.254.0.1`这一行中的这个IP是kubernetes这个service的IP,k8s-1.8.x版本默认是这个值,你需要通过执行命令`kubectl get service kubernetes`进行确认。如果命令返回的值不一样,则需要进行对应的更改
```
$ kubectl get service kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 1d
```
* `DNS.4`与`DNS.5`这两行,结尾分别为`kube`与`kube.local`,这个需要查看kubelet的配置确认,如果kubelet的配置为其他,则这两行需要进行对应的修改。
```
$ ps -ef | grep kubelet
... --cluster-domain=kube.local ...
```
```
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = CN
ST = GuangDong
L = GuangZhou
O = CTYUN
OU = CCSE
CN = {{vip}}
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.kube
DNS.5 = kubernetes.default.svc.kube.local
IP.1 = {{vip}}
IP.2 = 127.0.0.1
IP.3 = 10.254.0.1
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
```
接着,我们执行下面的命令,生成kube-apiserver的证书签名请求文件kube-apiserver.csr:
```
$ openssl req -new -key kube-apiserver.key -out kube-apiserver.csr -config kube-apiserver.csr.conf
```
然后,我们使用CA证书对这个请求文件进行签名(确保该目录下dcos_ca.key与dcos_ca.crt文件都存在),得到kube-apiserver.crt:
```
$ openssl x509 -req -in kube-apiserver.csr -CA dcos_ca.crt -CAkey dcos_ca.key -CAcreateserial -out kube-apiserver.crt -days 36500 -extensions v3_ext -extfile kube-apiserver.csr.conf
```
接下来,编辑`/etc/kubernetes/apiserver`文件,更改`--tls-private-key-file`和`--tls-cert-file`这两个参数的值为刚才的新证书,最终如下:
```
--tls-private-key-file=/etc/kubernetes/key/kube-apiserver.key --tls-cert-file=/etc/kubernetes/key/kube-apiserver.crt
```
最后,重启kube-apiserver
```
$ systemctl restart kube-apiserver
```
#### **2.3 给kube-apiserver开启x509证书认证及RBAC授权(每个Master都要操作)**
编辑`/etc/kubernetes/apiserver`文件,添加启动参数`--client-ca-file`与`--authorization-mode`。我们可以把这个两个参数添加在该文件最后一行`API_ARGS="..."`里面,如下:
```
API_ARGS="--client-ca-file=/etc/kubernetes/key/dcos_ca.crt --authorization-mode=RBAC ..."
```
然后,重启kube-apiserver
#### **2.4 生成`/etc/kubernetes/admin.conf`文件**
本小节要在`/etc/kubernetes/key`目录下操作,在一个Master节点上操作即可。
执行如下命令,生成client_kubernetes-admin.key和client_kubernetes-admin.crt文件,这两个文件是其他组件(scheduler、controller-manager、kubectl等)用来访问kube-apiserver时所需要携带的身份信息:
```
$ openssl genrsa -out client_kubernetes-admin.key 4096
$ openssl req -new -nodes -key client_kubernetes-admin.key -out client_kubernetes-admin.csr -subj "/O=system:masters/CN=kubernetes-admin"
$ openssl x509 -req -days 36500 -in client_kubernetes-admin.csr -CA dcos_ca.crt -CAkey dcos_ca.key -CAcreateserial -out client_kubernetes-admin.crt
```
然后,创建文件`/etc/kubernetes/admin.conf`,内容如下:
```
apiVersion: v1
kind: Config
clusters:
- name: kubernetes
cluster:
server: https://{vip}:6443
certificate-authority-data: {cacert}
users:
- name: admin
user:
client-certificate-data: {cert}
client-key-data: {key}
contexts:
- name: admin@kubernetes
context:
cluster: kubernetes
user: admin
current-context: admin@kubernetes
```
上面有几个参数需要填充,`{vip}`要替换为master的vip。另外三个`{cacert}`、`{cert}`、`{key}`,通过下面的命令进行替换:
```
$ cacert=$(cat /etc/kubernetes/key/dcos_ca.crt | base64 -w 0)
$ key=$(cat /etc/kubernetes/key/client_kubernetes-admin.key | base64 -w 0)
$ cert=$(cat /etc/kubernetes/key/client_kubernetes-admin.crt | base64 -w 0)
$ sed -i "s#{cacert}#${cacert}#g" /etc/kubernetes/admin.conf
$ sed -i "s#{key}#${key}#g" /etc/kubernetes/admin.conf
$ sed -i "s#{cert}#${cert}#g" /etc/kubernetes/admin.conf
```
替换变量,得到完整的admin.conf文件后,把它拷贝到另外两个master节点的`/etc/kubernetes/`目录下。
#### **2.5 配置scheduler及controller-manager使用https访问kube-apiserver(每个Master节点都要操作)**
配置kube-scheduler,编辑`/etc/kubernetes/scheduler`,找到`MASTER="..."`一行,替换成如下:
```
MASTER="--kubeconfig=/etc/kubernetes/admin.conf"
```
配置kube-controller-manager,编辑`/etc/kubernetes/controller-manager`,找到`MASTER="..."`一行,替换成如下:
```
MASTER="--kubeconfig=/etc/kubernetes/admin.conf"
```
然后,重启组件:
```
$ systemctl restart kube-scheduler kube-controller-manager
```
#### **2.6 配置kubelet及kube-proxy使用https访问kube-apiserver(每个Worker节点都要操作)**
注意:如果Master节点上也安装了kubelet及kube-proxy,则Master节点也要操作。
配置kubelet,编辑`/etc/kubernetes/kubelet`,找到`KUBECONFIG="..."`一行,替换成如下:
```
KUBECONFIG="--kubeconfig=/etc/kubernetes/admin.conf"
```
配置kube-proxy,编辑`/etc/kubernetes/proxy`,找到`KUBECONFIG="..."`一行,替换成如下:
```
KUBECONFIG="--kubeconfig=/etc/kubernetes/admin.conf"
```
重启:
```
$ systemctl restart kubelet kube-proxy
```
#### **2.7 关闭kube-apiserver的8080端口(每个Master节点都要操作)**
编辑`/etc/kubernetes/apiserver`,找到配置参数`--insecure-port=8080`,更改成`--insecure-port=0`,然后重启kube-apiserver
#### **2.8 更改kube-scheduler与kube-controller-manager监听127.0.0.1(每个Master节点都要操作)**
编辑`/etc/kubernetes/scheduler`,找到`--address=0.0.0.0`,更改为`--address=127.0.0.1`。
编辑`/etc/kubernetes/controller-manager`,找到`--address=0.0.0.0`,更改为`--address=127.0.0.1`。
重启kube-scheduler与kube-controller-manager
#### **2.8 给kubelet添加认证(每个Worker节点都要操作)**
编辑`/etc/kubernetes/kubelet`文件,增加启动参数`--anonymous-auth=false`以及`--client-ca-file=/etc/kubernetes/key/dcos_ca.crt`,我们可以把这两个启动参数放在`KUBELET_ARGS="..."`这一行,如下:
```
KUBELET_ARGS="--anonymous-auth=false --client-ca-file=/etc/kubernetes/key/dcos_ca.crt ..."
```
重启kubelet。
接着,我们需要给kube-apiserver增加启动参数(每个Master节点都要操作),因为kubectl exec命令进行到容器时,kube-apiserver需要调用kubelet,而此时kubelet开启了认证,kube-apiserver需要增加访问凭证。
编辑`/etc/kubernetes/apiserver`文件,我们在`API_ARGS="..."`这一行增加如下两个参数:
```
API_ARGS="--kubelet-client-certificate=/etc/kubernetes/key/kube-apiserver.crt --kubelet-client-key=/etc/kubernetes/key/kube-apiserver.key ..."
```
然后,重启kube-apiserver。
## **三、插件**
#### **3.1 网络插件Calico**
etcd增加授权后,calico无法直接访问etcd,因此我们需要把calico进行升级到3.8,这样calico就不需要访问etcd,访问kube-apiserver即可。
操作流程参考: http://10.128.28.71:8181/docs/ccse/ccse-1c7a1fi164k3u-ccse-1c7a1jga3g52n-ccse-1cmru4unrkigm-ccse-1cpg3q309o3k5.md
#### **3.2 监控插件Heapster**
首先为heapster创建一个serviceAccount(如果已经有的话,创建命令会报错,不用理会),然后给它绑定权限
```
$ kubectl create serviceaccount heapster -n kube-system
$ kubectl create clusterrolebinding heapster-cluster-admin --serviceaccount kube-system:heapster --clusterrole cluster-admin
```
然后执行命令编辑heapster这个deploymetnt,在适当位置增加serviceAccount这一行,然后更改--source这一行的内,最终如下:
```
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
...
spec:
...
template:
...
spec:
serviceAccount: heapster # 添加这一行
containers:
- name: heapster
...
command:
- /heapster
- --source=kubernetes:https://kubernetes.default # 更改这一行
```
#### **3.3 负载均衡插件NginxIngressController**
首先为nginx-ingress-controller创建一个serviceAccount(如果已经有的话,创建命令会报错,不用理会),然后给它绑定权限
```
$ kubectl create serviceaccount nginx-ingress-controller -n kube-system
$ kubectl create clusterrolebinding nginx-ingress-controller-cluster-admin --serviceaccount kube-system:nginx-ingress-controller --clusterrole cluster-admin
```
然后,编辑nginx-ingress-controller这个daemonset,在适当的位置添加`serviceAccount: nginx-ingress-controller`这一行。
然后,重启nginx-ingress-controller的容器。
- 常用命令
- 安装
- 安装Kubeadm
- 安装单Master集群
- 安装高可用集群(手动分发证书)
- 安装高可用集群(自动分发证书)
- 启动参数解析
- certificate-key
- ETCD相关参数
- Kubernetes端口汇总
- 安装IPv4-IPv6双栈集群
- 下载二进制文件
- 使用Kata容器
- 快速安装shell脚本
- 存储
- 实践
- Ceph-RBD实践
- CephFS实践
- 对象存储
- 阿里云CSI
- CSI
- 安全
- 认证与授权
- 认证
- 认证-实践
- 授权
- ServiceAccount
- NodeAuthorizor
- TLS bootstrapping
- Kubelet的认证
- 准入控制
- 准入控制示例
- Pod安全上下文
- Selinux-Seccomp-Capabilities
- 给容器配置安全上下文
- PodSecurityPolicy
- K8S-1.8手动开启认证与授权
- Helm
- Helm命令
- Chart
- 快速入门
- 内置对象
- 模板函数与管道
- 模板函数列表
- 流程控制
- Chart依赖
- Repository
- 开源的Chart包
- CRD
- CRD入门
- 工作负载
- Pod
- Pod的重启策略
- Container
- 探针
- 工作负载的状态
- 有状态服务
- 网络插件
- Multus
- Calico+Flannel
- 容器网络限速
- 自研网络插件
- 设计文档
- Cilium
- 安装Cilium
- Calico
- Calico-FAQ
- IPAM
- Whereabouts
- 控制平面与Pod网络分开
- 重新编译
- 编译kubeadm
- 编译kubeadm-1.23
- 资源预留
- 资源预留简介
- imagefs与nodefs
- 资源预留 vs 驱逐 vs OOM
- 负载均衡
- 灰度与蓝绿
- Ingress的TLS
- 多个NginxIngressController实例
- Service的会话亲和
- CNI实践
- CNI规范
- 使用cnitool模拟调用
- CNI快速入门
- 性能测试
- 性能测试简介
- 制作kubemark镜像
- 使用clusterloader2进行性能测试
- 编译clusterloader2二进制文件
- 搭建性能测试环境
- 运行density测试
- 运行load测试
- 参数调优
- Measurement
- TestMetrics
- EtcdMetrics
- SLOMeasurement
- PrometheusMeasurement
- APIResponsivenessPrometheus
- PodStartupLatency
- FAQ
- 调度
- 亲和性与反亲和性
- GPU
- HPA
- 命名规范
- 可信云认证
- 磁盘限速
- Virtual-kubelet
- VK思路整理
- Kubebuilder
- FAQ
- 阿里云日志服务SLS