kubernetes部署 kube-apiserver 组件

本文档讲解使用 keepalived 和 haproxy 部署一个 3 节点高可用 master 集群的步骤。

kube-apiserver 集群各节点的名称和 IP 如下:

kube-node0:192.168.111.10
kube-node1:192.168.111.11
kube-node2:192.168.111.12

创建 kubernetes 证书和私钥
其中会用到上面的三个主机IP,一个vip(192.168.111.9),这些都是kube-apiserver的对外提供服务的IP,还有就是kubernetes本身会创建一个service,它的IP是我们在启动kube-apiserver是定义的--service-cluster-ip-range 参数指定的IP地址段(10.254.0.0/24,)的第一个IP地址,后续可以通过kubectl get svc kubernetes命令获取。

  1. cat > kubernetes-csr.json <<EOF
  2. {
  3. "CN": "kubernetes",
  4. "hosts": [
  5. "127.0.0.1",
  6. "192.168.111.9",
  7. "192.168.111.10",
  8. "192.168.111.11",
  9. "192.168.111.12",
  10. "10.254.0.1",
  11. "kubernetes",
  12. "kubernetes.default",
  13. "kubernetes.default.svc",
  14. "kubernetes.default.svc.cluster",
  15. "kubernetes.default.svc.cluster.local"
  16. ],
  17. "key": {
  18. "algo": "rsa",
  19. "size": 2048
  20. },
  21. "names": [
  22. {
  23. "C": "CN",
  24. "ST": "ChongQing",
  25. "L": "ChongQing",
  26. "O": "k8s",
  27. "OU": "yunwei"
  28. }
  29. ]
  30. }
  31. EOF

生成认证文件:

  1. cfssl gencert -ca=/etc/kubernetes/ca/ca.pem \
  2. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  3. -config=/etc/kubernetes/ca/ca-config.json \
  4. -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

将生成的证书和私钥文件拷贝到其他kube-apiserver节点
# scp /etc/kubernetes/ca/kubernetes* 192.168.111.11:/etc/kubernetes/ca/
# scp /etc/kubernetes/ca/kubernetes* 192.168.111.12:/etc/kubernetes/ca/

生成token认证文件

#生成随机token
# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
8afdf3c4eb7c74018452423c29433609

#按照固定格式写入token.csv,注意替换token内容
# echo "8afdf3c4eb7c74018452423c29433609,kubelet-bootstrap,10001,\"system:kubelet-bootstrap\"" > /etc/kubernetes/ca/token.csv
kube-apiserver的配置文件,三台一样(配置文件中将127.0.0.1的非https的api开放,在kube-scheduler服务和kube-controller-manager服务就可以不用认证授权了。):

  1. cat > /lib/systemd/system/kube-apiserver.service <<EOF
  2. [Unit]
  3. Description=Kubernetes API Server
  4. Documentation=https://github.com/GoogleCloudPlatform/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-apiserver \
  8. --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
  9. --insecure-bind-address=127.0.0.1 \
  10. --kubelet-https=true \
  11. --bind-address=192.168.111.12 \
  12. --authorization-mode=Node,RBAC \
  13. --runtime-config=api/all \
  14. --enable-bootstrap-token-auth \
  15. --token-auth-file=/etc/kubernetes/ca/token.csv \
  16. --tls-cert-file=/etc/kubernetes/ca/kubernetes.pem \
  17. --tls-private-key-file=/etc/kubernetes/ca/kubernetes-key.pem \
  18. --client-ca-file=/etc/kubernetes/ca/ca.pem \
  19. --service-account-key-file=/etc/kubernetes/ca/ca-key.pem \
  20. --etcd-cafile=/etc/kubernetes/ca/ca.pem \
  21. --etcd-certfile=/etc/kubernetes/ca/kubernetes.pem \
  22. --etcd-keyfile=/etc/kubernetes/ca/kubernetes-key.pem \
  23. --service-cluster-ip-range=10.254.0.0/16 \
  24. --etcd-servers=https://192.168.111.10:2379,https://192.168.111.11:2379,https://192.168.111.12:2379 \
  25. --enable-swagger-ui=true \
  26. --allow-privileged=true \
  27. --audit-log-maxage=30 \
  28. --audit-log-maxbackup=3 \
  29. --audit-log-maxsize=100 \
  30. --audit-log-path=/var/lib/audit.log \
  31. --v=2
  32. Restart=on-failure
  33. RestartSec=5
  34. Type=notify
  35. LimitNOFILE=65536
  36. [Install]
  37. WantedBy=multi-user.target
  38. EOF

systemctl daemon-reload && for SERVICES in kube-apiserver;do systemctl enable $SERVICES; systemctl restart $SERVICES; systemctl status $SERVICES; done

打印 kube-apiserver 写入 etcd 的数据

  1. ETCDCTL_API=3 etcdctl \
  2. --endpoints=https://192.168.111.10:2379,https://192.168.111.11:2379,https://192.168.111.12:2379 \
  3. --cacert=/etc/kubernetes/ca/ca.pem \
  4. --cert=/etc/kubernetes/ca/etcd.pem \
  5. --key=/etc/kubernetes/ca/etcd-key.pem \
  6. get /registry/ --prefix --keys-only

部署 kubectl 命令行工具

  1. cat > admin-csr.json <<EOF
  2. {
  3. "CN": "admin",
  4. "hosts": [],
  5. "key": {
  6. "algo": "rsa",
  7. "size": 2048
  8. },
  9. "names": [
  10. {
  11. "C": "CN",
  12. "ST": "ChongQing",
  13. "L": "ChongQing",
  14. "O": "system:masters",
  15. "OU": "yunwei"
  16. }
  17. ]
  18. }
  19. EOF

生成认证文件:

  1. cfssl gencert -ca=/etc/kubernetes/ca/ca.pem \
  2. -ca-key=/etc/kubernetes/ca/ca-key.pem \
  3. -config=/etc/kubernetes/ca/ca-config.json \
  4. -profile=kubernetes admin-csr.json | cfssljson -bare admin

生成kubectl的config文件(可以三台都执行一遍,也可以一台执行后复制过去):

  1. kubectl config set-cluster kubernetes \
  2. --certificate-authority=/etc/kubernetes/ca/ca.pem \
  3. --embed-certs=true \
  4. --server=https://192.168.111.9:8443
  5. kubectl config set-credentials admin \
  6. --client-certificate=/etc/kubernetes/ca/admin.pem \
  7. --client-key=/etc/kubernetes/ca/admin-key.pem \
  8. --embed-certs=true
  9. kubectl config set-context kubernetes \
  10. --cluster=kubernetes \
  11. --user=admin
  12. kubectl config use-context kubernetes

mkdir -p ~/.kube

scp ~/.kube/config 192.168.111.11:~/.kube/config
scp ~/.kube/config 192.168.111.12:~/.kube/config

检查集群信息(任意一台)

  1. # kubectl cluster-info
  2. Kubernetes master is running at https://192.168.111.9:8443
  3.  
  4. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
  5. # kubectl get all --all-namespaces
  6. NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. default service/kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 34d
  8. # kubectl get componentstatuses
  9. NAME STATUS MESSAGE ERROR
  10. scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused
  11. controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused
  12. etcd-2 Healthy {"health": "true"}
  13. etcd-0 Healthy {"health": "true"}
  14. etcd-1 Healthy {"health": "true"}

检查 kube-apiserver 监听的端口
6443: 接收 https 请求的安全端口,对所有请求做认证和授权

  1. # ss -netstat -lnpt|grep kube
  2. LISTEN 0 128 192.168.111.12:6443 *:* users:(("kube-apiserver",pid=878,fd=3)) timer:(keepalive,031ms,0) ino:23491 sk:ffff880078d34d80 <->
  3. LISTEN 0 128 127.0.0.1:8080 *:* users:(("kube-apiserver",pid=4168,fd=68)) ino:35479 sk:ffff88002391ec80 <->

kubernetes部署 kube-apiserver服务的更多相关文章

  1. 第11篇Kubernetes部署微服务电商平台

        kubernetes部署sock-shop微服务电商平台: 准备条件   确保kubernetes可以访问:reg.yunwei.edu镜像库   需要准备镜像:       部署微服务   ...

  2. Kubernetes 部署集群内部DNS服务

    Kubernetes 部署集群内部DNS服务 部署官网:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/ ...

  3. 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes

    前言 在之前的一篇文章中,我们介绍了 如何将一个本地的 Java 应用程序直接部署到阿里云 ECS ,有不少读者反馈,如果目前已经在使用阿里云容器服务 Kubernetes 了,那该如何配合这个插件部 ...

  4. Kubernetes 部署微服务电商平台(16)

    一.概念 微服务就是很小的服务,小到一个服务只对应一个单一的功能,只做一件事.这个服务可以单独部署运行,服务之间可以通过RPC来相互交互,每个微服务都是由独立的小团队开发,测试,部署,上线,负责它的整 ...

  5. Kubernetes 部署 Nebula 图数据库集群

    Kubernetes 是什么 Kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,Kubernetes 提供了应 ...

  6. 为什么 kubernetes 天然适合微服务

    最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样.(可参考<容器平台选型的十大模式: ...

  7. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

  8. 为什么 kubernetes 天然适合微服务 (3)

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 四.Kubernetes 本身就是微服务架构 基于上面这十个设计要点,我们再回来看 Kubernetes,会发现 ...

  9. kubernetes部署jenkins(Docker in Docker)及认证

    引言 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. 本文将Jenkins的master与slave置于Pod中,部署在namespace:jenk ...

随机推荐

  1. 安装hexo博客

    前言 ** 跟着步骤一步一步来进行安装 ** 准备环境:node.js和包管理器npm 1:查看包文件 接着安装 淘宝镜像源 sudo这个需要添加获取文件夹访问权限 sudo npm install ...

  2. 使用spire.doc导出支持编辑Latex公式的标准格式word

    背景 之前有的教辅标注需求,在导出题库的时候希望顺便导出可以查看word,方便线下预览成品效果,因为只是用来预览并且为了沿用前端的样式,当时方案就是直接生成html,写个word的文件头,这样就可以用 ...

  3. 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序

    上一篇:手把手教你学Dapr - 2. 必须知道的概念 注意: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,推荐使用Windows Termin ...

  4. 数据流中的中位数 牛客网 剑指Offer

    数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...

  5. Python import Queue ImportError: No module named 'Queue'

    python3 中引入Queue 会报出这个问题 python3 中这样引入 import queue python2 中这样引入 import Queue 为了兼容 可以这样 import sys ...

  6. sqlldr 导入有中文乱码问题

    1.导入成功后,查看导入数据有乱码 2.查看字符集为uft8 select * from v$nls_parameters where PARAMETER like '%NLS_CHARACTERSE ...

  7. CLion 2021.2 debug报错 process exited with status -1 (attach failed (Not allowed to attach to process.

    Clion 升级 2021.2 版本后 debug 报错: process exited with status -1 (attach failed (Not allowed to attach to ...

  8. connect & send 在三次握手过程中的有趣问题

    一.问题回顾 面试的时候被问到的问题,原问题是: 1:写一下socket网络编程服务端和客户端常用的函数. 2:如果服务端在listen之后没有accept,那客户端的connect会返回吗?为什么? ...

  9. 03 | 变量的解构赋值 | es6

    变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. let a ...

  10. PTA甲级1094 The Largest Generation (25分)

    PTA甲级1094 The Largest Generation (25分) A family hierarchy is usually presented by a pedigree tree wh ...