二进制安装kubernetes v1.11.2 (第八章 kube-apiserver 部署)

继续上一章部署。

八、部署kube-apiserver组件

使用第七章的haproxy和keepalived部署的高可用集群提供的VIP:${MASTER_VIP}

8.1 下载二进制文件,参考 第三章 

8.2 创建 kubernetes 证书和私钥

source /opt/k8s/bin/environment.sh
cat > kubernetes-csr.json <<EOF
{"CN": "kubernetes","hosts": ["127.0.0.1","192.168.56.20","192.168.56.20","${MASTER_VIP}","${CLUSTER_KUBERNETES_SVC_IP}","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "4Paradigm"}]
}
EOF
  • host 字段指定授权使用该证书的IP或者域名列表,这里列出了 VIP、apiserver节点IP,kubernetes服务IP和域名
  • 域名最后不能是 . (如不能是kubernetes.default.svc.cluster.local.),否则解析失败,提示 x509: cannot parse dnsName "kubernetes.default.svc.cluster.local."
  • 如果使用非 cluster.local 域名,,如 xxx.com,则需要修改域名列表中的最后两个域名为:kubernetes.default.svc.xxx、kubernetes.default.svc.xxx.com
  • kubernetes服务IP是apiserver自动创建的,一般是 -service-cluster-ip-range 参数指定的网段的第一个IP,后续可以通过如下命令获取:
$ kubectl get svc kubernetes
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   1d

8.3 生成证书和私钥

cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \-ca-key=/etc/kubernetes/cert/ca-key.pem \-config=/etc/kubernetes/cert/ca-config.json \-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
ls kubernetes*pem

8.4 将生成的证书和私钥文件拷贝到master节点

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "mkdir -p /etc/kubernetes/cert/ && sudo chown -R k8s /etc/kubernetes/cert/"scp kubernetes*.pem k8s@${master_ip}:/etc/kubernetes/cert/
done

8.5 创建加密配置文件

source /opt/k8s/bin/environment.sh
cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:- resources:- secretsproviders:- aescbc:keys:- name: key1secret: ${ENCRYPTION_KEY}- identity: {}
EOF

8.6 将加密配置文件拷贝到 master 节点的 /etc/kubernetes 目录下

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"scp encryption-config.yaml root@${master_ip}:/etc/kubernetes/
done

替换后的加密配置文件:

[root@k8s-m1 cert]# more encryption-config.yaml 
kind: EncryptionConfig
apiVersion: v1
resources:- resources:- secretsproviders:- aescbc:keys:- name: key1secret: V8NUF8gATb1bZmBke9NRVw33JHt3elTDfNoIi0uhOFI=- identity: {}

8.7 创建 kube-apiserver systemd unit 模板文件

source /opt/k8s/bin/environment.sh
cat > kube-apiserver.service.template <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target[Service]
ExecStart=/opt/k8s/bin/kube-apiserver \\--enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\--anonymous-auth=false \\--experimental-encryption-provider-config=/etc/kubernetes/encryption-config.yaml \\--advertise-address=##NODE_IP## \\--bind-address=##NODE_IP## \\--insecure-port=0 \\--authorization-mode=Node,RBAC \\--runtime-config=api/all \\--enable-bootstrap-token-auth \\--service-cluster-ip-range=${SERVICE_CIDR} \\--service-node-port-range=${NODE_PORT_RANGE} \\--tls-cert-file=/etc/kubernetes/cert/kubernetes.pem \\--tls-private-key-file=/etc/kubernetes/cert/kubernetes-key.pem \\--client-ca-file=/etc/kubernetes/cert/ca.pem \\--kubelet-client-certificate=/etc/kubernetes/cert/kubernetes.pem \\--kubelet-client-key=/etc/kubernetes/cert/kubernetes-key.pem \\--service-account-key-file=/etc/kubernetes/cert/ca-key.pem \\--etcd-cafile=/etc/kubernetes/cert/ca.pem \\--etcd-certfile=/etc/kubernetes/cert/kubernetes.pem \\--etcd-keyfile=/etc/kubernetes/cert/kubernetes-key.pem \\--etcd-servers=${ETCD_ENDPOINTS} \\--enable-swagger-ui=true \\--allow-privileged=true \\--apiserver-count=2 \\--audit-log-maxage=30 \\--audit-log-maxbackup=3 \\--audit-log-maxsize=100 \\--audit-log-path=/var/log/kube-apiserver-audit.log \\--event-ttl=1h \\--alsologtostderr=true \\--logtostderr=false \\--log-dir=/var/log/kubernetes \\--v=2
Restart=on-failure
RestartSec=5
Type=notify
User=k8s
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
EOF
  • --experimental-encryption-provider-config:启用加密特性
  • --authorization-mode=Node,RBAC: 开启 Node 和 RBAC 授权模式,拒绝未授权的请求
  • --enable-admission-plugins:启用 ServiceAccount 和 NodeRestriction
  • --service-account-key-file:签名 ServiceAccount Token 的公钥文件,kube-controller-manager 的 --service-account-private-key-file 指定私钥文件,两者配对使用
  • --tls-*-file:指定 apiserver 使用的证书、私钥和 CA 文件。--client-ca-file 用于验证 client (kue-controller-manager、kube-scheduler、kubelet、kube-proxy 等)请求所带的证书
  • --kubelet-client-certificate、--kubelet-client-key:如果指定,则使用 https 访问 kubelet APIs;需要为证书对应的用户(上面 kubernetes*.pem 证书的用户为 kubernetes) 用户定义 RBAC 规则,否则访问 kubelet API 时提示未授权
  • --bind-address: 不能为 127.0.0.1,否则外界不能访问它的安全端口 6443
  • --insecure-port=0:关闭监听非安全端口(8080)
  • --service-cluster-ip-range: 指定 Service Cluster IP 地址段
  • --service-node-port-range: 指定 NodePort 的端口范围
  • --runtime-config=api/all=true: 启用所有版本的 APIs,如 autoscaling/v2alpha1
  • --enable-bootstrap-token-auth:启用 kubelet bootstrap 的 token 认证
  • --apiserver-count=3:指定集群运行模式,多台 kube-apiserver 会通过 leader 选举产生一个工作节点,其它节点处于阻塞状态
  • User=k8s:使用 k8s 账户运行

 

8.8 为各节点创建和分发 kube-apiserver systemd unit 文件

替换模板中的变量,生成各master节点的 systemd unit 文件

source /opt/k8s/bin/environment.sh
for (( i=0; i < 2; i++ ))dosed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" kube-apiserver.service.template > kube-apiserver-${NODE_IPS[i]}.service 
done
ls kube-apiserver*.service

8.9 分发生成的 systemd unit 文件

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "mkdir -p /var/log/kubernetes && chown -R k8s /var/log/kubernetes"scp kube-apiserver-${master_ip}.service root@${master_ip}:/etc/systemd/system/kube-apiserver.service
done
  • 需要先创建日志目录
  • 分发后,文件重命名为 kube-apiserver.service

 8.10 启动kube-apiserver 服务

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver"
done

8.11 检查 kube-apiserver 运行状态

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IPS[@]}doecho ">>> ${master_ip}"ssh root@${master_ip} "systemctl status kube-apiserver |grep 'Active:'"
done

确保服务状态为 Active: active (running)

查看日志的方法:journalctl -u kube-apiserver

8.12 打印 kube-apiserver 写入 etcd 数据

source /opt/k8s/bin/environment.sh
ETCDCTL_API=3 etcdctl \--endpoints=${ETCD_ENDPOINTS} \--cacert=/etc/kubernetes/cert/ca.pem \--cert=/etc/etcd/cert/etcd.pem \--key=/etc/etcd/cert/etcd-key.pem \get /registry/ --prefix --keys-only

8.13 检查集群信息

 

[root@k8s-m1 template]# kubectl cluster-info
Kubernetes master is running at https://192.168.56.6:8443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@k8s-m1 template]# kubectl get all --all-namespaces
NAMESPACE   NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
default     service/kubernetes   ClusterIP   10.254.0.1   <none>        443/TCP   9m
[root@k8s-m1 template]# kubectl get componentstatuses
NAME                 STATUS      MESSAGE                                                                                     ERROR
controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}                                                                           
etcd-1               Healthy     {"health":"true"}  

8.14 如果执行 kubectl 命令式时输出如下错误信息,则说明使用的 ~/.kube/config 文件不对,请切换到正确的账户后再执行该命令:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

8.15 执行 kubectl get componentstatuses 命令时,apiserver 默认向 127.0.0.1 发送请求。当 controller-manager、scheduler 以集群模式运行时,有可能和 kube-apiserver 不在一台机器上,这时 controller-manager 或 scheduler 的状态为 Unhealthy,但实际上它们工作正常

8.16 检查 kube-apiserver 监听的端口

[root@k8s-m1 template]# sudo netstat -lnpt|grep kube
tcp        0      0 192.168.56.20:6443      0.0.0.0:*               LISTEN      9918/kube-apiserver 
  • 6443  接收 https 请求的安全端口,对所有请求做认证和授权
  • 由于关闭了非安全端口,所以没有监听8080

8.17 授予 kubernetes 证书访问 kubelet API 的权限

在执行 kubectl exec、run、logs 等命令时,apiserver 会转发到 kubelet,这里定义RBAC规则

[root@k8s-m1 template]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created

 

转载于:https://www.cnblogs.com/aast/p/9849416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element手机验证格式_vue封装 element-ui form表单验证 正则匹配手机号 自定义校验表格内容...

效果image.png在methods中//检查手机号isCellPhone(val) {if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {return false;} else {return true;}}在template中v-model"forgetForm.phone"type"text"auto-complete"off"placeholder"请输入你的手机…

multi-mechanize error: can not find test script: v_user.py问题

从github上下载&#xff0c;安装multi-mechanize&#xff0c;新建工程&#xff0c;运行工程报错。 环境&#xff1a; win7-x64, python 2.7 multi-mechanize can not find test script: v_user.py 查看了github上的工程&#xff0c;项目无人维护&#xff0c;这个问题2016年11月…

@RequestMapping 用法详解之地址映射

引言&#xff1a; 前段时间项目中用到了RESTful模式来开发程序&#xff0c;但是当用POST、PUT模式提交数据时&#xff0c;发现服务器端接受不到提交的数据&#xff08;服务器端参数绑定 没有加任何注解&#xff09;&#xff0c;查看了提交方式为application/json&#xff0c; 而…

我的第一个网页 代码_我在免费代码营的第一个月

我的第一个网页 代码by Elliott McNary埃利奥特麦克纳里(Elliott McNary) 我在免费代码营的第一个月 (My First Month At Free Code Camp) I wanted to build an app that would help artists to make more money.我想开发一个可以帮助艺术家赚更多钱的应用。 I had a clear …

java pem rsa_如何从java中的pfx文件/ pem文件中获取RSA公钥的指数和模数值

I want to extract information about RSA Public Key from the pfx file using java.我有一个pfx文件并转换为x509 Pem文件 . 从pem文件&#xff0c;在终端中使用以下命令&#xff1a;openssl x509 -in file.pem -text我能够查看公钥指数和模数值主题公钥信息&#xff1a;Publ…

jmeter+maven+jenkins自动化接口测试(下)

mavenjmeter已经写好了&#xff0c;可以通过maven来执行jmeter的接口测试脚本&#xff0c;怎样实现定时执行测试并发送报告邮件就需要通过jenkins了&#xff08;jmeter或者testng也可以结合不同的邮件jar包来发送邮件&#xff0c;这里使用jenkins&#xff09; 安装jenkins笔记有…

在使用angularjs过程,ng-repeat中track by的作用

转载&#xff1a;http://segmentfault.com/q/1010000000405730<div ng-repeat"links in slides"> <div ng-repeat"link in links track by $index">link.name</div></div>Error: [ngRepeat:dupes]这个出错提示具体到题主的情况…

java判断读到末尾_IO流如何判断读取到了流的结尾,程序中以-1来判断,是流中写入一个EOF表示流结束吗,底层实现呢?...

-1不是流中写入的数据。read()方法返回的数据都是unsigned byte&#xff0c;即是[0,255]。底层实现有很多&#xff0c;比如socket IO和文件IO&#xff0c;甚至你自己也可以实现。——————————————————————给两个类的代码给你看看&#xff0c;理解一下这个东…

结束书

by William Countiss威廉Countiss 结束书 (Closing the Book on Closures) JavaScript closures are an important, but notoriously confusing concept. There’s no escaping it — if you want to grow as a developer, you need to understand what closures are and how …

java激励_激励干个人java的不足之处

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF&#xff0c;J2EEDP)以及综合模式。你应该十分了解UML&#xff0c;尤其是class&#xff0c;object&#xff0c;interaction以及statediagrams。2.你需要学习JAVA语言的基础知识以及它的核心类库(collections&#xff0c;…

Bioconductor软件安装与升级

1 安装工具Bioc的软件包不能使用直接install.packages函数&#xff0c;它有自己的安装工具&#xff0c;使用下面的代码&#xff1a; source("https://bioconductor.org/biocLite.R")biocLite() 上面第二个语句将安装Bioconductor一些基础软件包&#xff0c;包括BiocI…

Laravel Kernel引导流程分析

Laravel Kernel引导流程分析 代码展示 protected function sendRequestThroughRouter($request) {# $this->app->instance(request, $request);# Facade::clearResolvedInstance(request);// 主要是这句代码$this->bootstrap();# return (new Pipeline($this->app)…

Android RecyclerView (一) 使用完全解析

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的…

数据透视表日期怎么选范围_透视范围

数据透视表日期怎么选范围by Tiffany White蒂芙尼怀特(Tiffany White) 透视范围 (Putting Scope in Perspective) In JavaScript, lexical scope deals with where your variables are defined, and how they will be accessible — or not accessible — to the rest of your…

feign调用多个服务_Spring Cloud 快速入门系列之feign–微服务之间的调用

我们将一个大的应用拆成多个小的服务之后&#xff0c;紧接着的一个问题就是&#xff0c;原本都在一个项目里&#xff0c;方法我可以随便调用&#xff0c;但是拆开后&#xff0c;原来的方法就没法直接调用了&#xff0c;这时候要怎么办&#xff1f;Spring Cloud提供了feign&…

Asix下日志包冲突

为什么80%的码农都做不了架构师&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的时候发生如下错误&#xff0c;原因是程序运行时logFactoryImple加载了JBOSS下面的sff4j包…

kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础&#xff1a;1. 已安装、配置kubernetes2. 集群中有tomcat与mysql容器镜像3. 有docker基础具体步骤部署tomcat创建tomcat RC对象我们想要在kubernetes集群中配置tomcat服务器&#xff0c;首先要保证集群中的节点上…

c# 测试运行时间毫秒级

long currentMillis (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;/*代码*/long currentMillis1 (DateTime.Now.Ticks - (new DateTime(1970, 1, 1, 0, 0, 0, 0)).Ticks) / 10000;MessageBox.Show((currentMillis1 - currentMillis).ToStri…

nodejs_NodeJS历险记

nodejsby Elliott McNary埃利奥特麦克纳里(Elliott McNary) NodeJS历险记 (Adventures in NodeJS) I built an app a couple of weeks ago after going through FreeCodeCamp’s Front-End curriculum and wanted to write an update as I head into NodeJS-land. I was final…

pytdx 获取板块指数_能否增加一个通过股票代码,板块指数代码获得中文名称的接口?...

T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf这个解码就是。/***************************************************股票代码列表和股票名称T0002/hq_cache/shex.tnfT0002/hq_cache/szex.tnf***************************************************/struct TdxSymbolMap {cha…