八.部署kube-apiserver

接下来3章节是部署Kube-Master相关的服务,包含:kube-apiserver,kube-controller-manager,kube-scheduler。

  1. 3个组件部署在一个节点上,为1个部署单元。
  2. kube-apiserver是无状态的,客户端如kubelet可通过启动参数"--api-servers"指定多个api-server,但只有第一个生效,即指定的多个api-server并没有达到高可用的目的(可能在后续版本解决),所以可通过负载均衡做api-server的HA。
  3. kube-controller-manager与kube-scheduler会修改集群的状态信息,如果3个节点上的相关服务同时生效则会有同步与一致性问题,所以此两种服务各自内部只能是主备的关系,kukubernetes采用租赁锁(lease-lock)实现leader的选举,具体到kube-controller-manager与kube-scheduler,启动时带上参数"--leader-elect=true"。

1. 创建kube-apiserver证书

1)创建kube-apiserver证书签名请求

# api-server启用双向TLS认证
[root@kubenode1 ~]# mkdir -p /etc/kubernetes/apiserver
[root@kubenode1 ~]# cd /etc/kubernetes/apiserver/
[root@kubenode1 apiserver]# touch apiserver-csr.json # hosts字段不为空时,指定授权使用该证书的ip与域名列表;
# 加入集群个节点ip,1次生成证书分发即可;
# 前端ha节点也需要与apiserver通信;
# 同时指定集群内部多个域名与kube-apiserver注册的名为kubernetes的服务ip(Service Cluster IP),一般是--service-cluster-ip-range 选项值指定的网段的第一个IP
[root@kubenode1 apiserver]# vim apiserver-csr.json
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"172.30.200.10",
"172.30.200.11",
"172.30.200.12",
"172.30.200.21",
"172.30.200.22",
"172.30.200.23",
"169.169.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ChengDu",
"L": "ChengDu",
"O": "k8s",
"OU": "cloudteam"
}
]
}

2)生成kube-apiserver证书与私钥

[root@kubenode1 apiserver]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
-ca-key=/etc/kubernetes/ssl/ca-key.pem \
-config=/etc/kubernetes/ssl/ca-config.json \
-profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver

# 分发apiserver.pem,apiserver-key.pem
[root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem root@172.30.200.22:/etc/kubernetes/apiserver/
[root@kubenode1 apiserver]# scp apiserver.pem apiserver-key.pem root@172.30.200.23:/etc/kubernetes/apiserver/

2. 配置kube-apiserver的systemd unit文件

相关可执行文件在部署kubectl时已部署完成。

1)创建kube-apiserver使用的客户端token文件

kubelet 启动时向 kube-apiserver发送注册信息,在双向的TLS加密通信环境中需要认证,手工为kubelet生成证书/私钥在node节点较少且数量固定时可行,采用TLS Bootstrapping 机制,可使大量的node节点自动完成向kube-apiserver的注册请求。

原理:kubelet 首次启动时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token.csv 一致,如果一致则自动为 kubelet生成证书和秘钥。

[root@kubenode1 ~]# mkdir -p /etc/kubernetes/bootstrap
[root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/
[root@kubenode1 bootstrap]# cat > token.csv << EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF # 分发
[root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv root@172.30.200.22:/etc/kubernetes/bootstrap/
[root@kubenode1 ~]# scp /etc/kubernetes/bootstrap/token.csv root@172.30.200.23:/etc/kubernetes/bootstrap/

2)配置kube-apiserver的systemd unit文件

[root@kubenode1 ~]# touch /usr/lib/systemd/system/kube-apiserver.service
[root@kubenode1 ~]# vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target [Service]
User=root
EnvironmentFile=/usr/local/kubernetes/kube-apiserver.conf
ExecStart=/usr/local/kubernetes/bin/kube-apiserver $KUBE_API_ARGS
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536 [Install]
WantedBy=multi-user.target # 启动参数文件;
# --admission-control:kuberneres集群的准入控制机制,各控制模块以插件的形式依次生效,集群时必须包含ServiceAccount;
# --bind-address:不能为 127.0.0.1;在本地址的6443端口开启https服务,默认值0.0.0.0; # --insecure-port=0:禁用不安全的http服务,默认开启,端口8080,设置为0禁用; --secure-port=6443:https安全端口,默认即6443,0表示禁用;
# --authorization-mode:在安全端口使用 RBAC 授权模式,未通过授权的请求拒绝;
# --service-cluster-ip-range:指定 Service Cluster IP 地址段,该地址段外部路由不可达;
# --service-node-port-range:指定 NodePort 的端口范围;
# --storage-backend:持久化存储类型,v1.6版本后默认即etcd3;
# --enable-swagger-ui:设置为true时,启用swagger-ui网页,可通过apiserver的usl/swagger-ui访问,默认为false;
# --allow-privileged:设置为true时,kubernetes允许在Pod中运行拥有系统特权的容器应用;
# --audit-log-*:审计日志相关;
# --event-ttl:apiserver中各时间保留时间,默认即1h,通常用于审计与追踪;
# --logtostderr:默认为true,输出到stderr,不输出到日志;
# --log-dir:日志目录;
# --v:日志级别
[root@kubenode1 ~]# touch /usr/local/kubernetes/kube-apiserver.conf
[root@kubenode1 ~]# vim /usr/local/kubernetes/kube-apiserver.conf
KUBE_API_ARGS="--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
--advertise-address=172.30.200.21 \
--bind-address=172.30.200.21 \
--insecure-port=0 \
--authorization-mode=Node,RBAC \
--runtime-config=rbac.authorization.k8s.io/v1beta1 \
--kubelet-https=true \
--token-auth-file=/etc/kubernetes/bootstrap/token.csv \
--service-cluster-ip-range=169.169.0.0/16 \
--service-node-port-range=10000-60000 \
--tls-cert-file=/etc/kubernetes/apiserver/apiserver.pem \
--tls-private-key-file=/etc/kubernetes/apiserver/apiserver-key.pem \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/etc/kubernetes/ssl/ca.pem \
--etcd-certfile=/etc/kubernetes/apiserver/apiserver.pem \
--etcd-keyfile=/etc/kubernetes/apiserver/apiserver-key.pem \
--storage-backend=etcd3 \
--etcd-servers=https://172.30.200.21:2379,https://172.30.200.22:2379,https://172.30.200.23:2379 \
--enable-swagger-ui=true \
--allow-privileged=true \
--apiserver-count=3 \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/var/lib/audit.log \
--event-ttl=1h \
--logtostderr=false \
--log-dir=/var/log/kubernetes/apiserver \
--v=2 1>>/var/log/kubernetes/apiserver/kube-apiserver.log 2>&1" # 创建日志目录
[root@kubenode1 ~]# mkdir -p /var/log/kubernetes/apiserver 

3. 启动并验证

[root@kubenode1 ~]# systemctl daemon-reload
[root@kubenode1 ~]# systemctl enable kube-apiserver
[root@kubenode1 ~]# systemctl start kube-apiserver
[root@kubenode1 ~]# systemctl status kube-apiserver

高可用Kubernetes集群-6. 部署kube-apiserver的更多相关文章

  1. 高可用Kubernetes集群-11. 部署kube-dns

    参考文档: Github介绍:https://github.com/kubernetes/dns Github yaml文件:https://github.com/kubernetes/kuberne ...

  2. 高可用Kubernetes集群-15. 部署Kubernetes集群统一日志管理

    参考文档: Github:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsear ...

  3. 高可用Kubernetes集群-14. 部署Kubernetes集群性能监控平台

    参考文档: Github介绍:https://github.com/kubernetes/heapster Github yaml文件: https://github.com/kubernetes/h ...

  4. 高可用Kubernetes集群-12. 部署kubernetes-ingress

    参考文档: Github:https://github.com/kubernetes/ingress-nginx Kubernetes ingress:https://kubernetes.io/do ...

  5. 高可用Kubernetes集群-8. 部署kube-scheduler

    十.部署kube-scheduler kube-scheduler是Kube-Master相关的3个服务之一,是有状态的服务,会修改集群的状态信息. 如果多个master节点上的相关服务同时生效,则会 ...

  6. 高可用Kubernetes集群-7. 部署kube-controller-manager

    九.部署kube-controller-manager kube-controller-manager是Kube-Master相关的3个服务之一,是有状态的服务,会修改集群的状态信息. 如果多个mas ...

  7. 高可用Kubernetes集群-10. 部署kube-proxy

    十二.部署kube-proxy 1. 创建kube-proxy证书 1)创建kube-proxy证书签名请求 # kube-proxy提取CN作为客户端的用户名,即system:kube-proxy. ...

  8. 高可用Kubernetes集群-13. 部署kubernetes-dashboard

    参考文档: Github介绍:https://github.com/kubernetes/dashboard Github yaml文件:https://github.com/kubernetes/d ...

  9. 高可用Kubernetes集群-9. 部署kubelet

    十一.部署kubelet 接下来两个章节是部署Kube-Node相关的服务,包含:kubelet,kube-proxy. 1. TLS bootstrap用户授权 # kubelet采用TLS Boo ...

随机推荐

  1. 奇妙的CSS3—导航栏下划线跟随效果

    先来看一下效果: 1.基本效果就是这样的 ,鼠标悬停,下划线划入.鼠标离开,下划线划出 2.下划线的划入是有方向的,从左侧划入悬停,下划线由左向右伸长.从右侧划入,下划线由又往左伸长 实现思路 1.导 ...

  2. vue中通过定义的数组循环将img的src引入图片却不显示图片问题解决方法

    需要前端循环图片数组将其放到页面中去. 需要将src渲染到页面中,如果单纯写src的路径会出现不显示图片的问题 因为图片路径在assets,所以需要require一下.

  3. objc中类方法里的self指的是什么

    所有转出“博客园”,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4121431.html objc中类方法里的self指的是什么 在objc中是可以在类方法中使 ...

  4. python2与python3的input函数的区别

    Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获 ...

  5. vim编辑器操作汇总

    VIM - Vi IMproved 7.4 编辑器操作汇总 vim   [参数]   [文件 ..]         编辑指定的文件 或: vim   [参数]    -     从标准输入(stdi ...

  6. flask中的蓝图实现模块化的应用

    Blueprint 蓝图的基本设想是当它们注册到应用上时,它们记录将会被执行的操作. 当分派请求和生成从一个端点到另一个的 URL 时,Flask 会关联蓝图中的视图函数. 简单来说,Blueprin ...

  7. 宏观看restframework序列化

    序列化 序列化意义 web有两种应用模式,一种是前后端不分离,一种是前后端分离,当前后端分离的时候,后端只需要向前端传输数据即可,不需要进行其他的操作,一般如果是中大型公司,都是前后端分离,这也是目前 ...

  8. python 将歌词解析封装成类,要求:提供一个方法(根据时间返回歌词) - 提示:封装两个类:歌词类、歌词管理类

    自己写的 有更好方案的大佬可以讨论一下 import bisectclass Lrc(): def __init__(self, sec, lrc): self.sec = sec self.lrc ...

  9. Leecode刷题之旅-C语言/python-326 3的幂

    /* * @lc app=leetcode.cn id=326 lang=c * * [326] 3的幂 * * https://leetcode-cn.com/problems/power-of-t ...

  10. Wiki版产品需求---产品需求文档到底是谁的?产品到底是谁的?

    在听了测试的一通唠叨之后,"内部实现一堆逻辑,只有一句话的需求文档","文档那么简单,我们怎么测试啊",心中突然想起来自己曾经干的一件当时觉得还不错的事情,但是 ...