环境准备
- 关闭防火墙和selinux
- 关闭swap分区
swap分区会影响到容器 - 设置hosts
可以把服务器都是设置成域名的方式,以便日后的ip更改 - 设置桥接的IPv4流量传递到iptables的链
由于网桥工作于数据链路层,在iptables没有开启 bridge-nf时,数据会直接经过网桥转发,结果就是对FORWARD的设置失效,centos默认不开启 bridge-nf - 集群时间同步
集群需要时间的同步,避免发生未知错误
关闭swap分区
swapoff -a # 临时
sed -ri ‘s/.swap./#&/’ /etc/fstab # 永久
设置桥接的IPv4流量传递到iptables的链
1
2
3
4
5
6cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 生效
集群时间同步
https://blog.csdn.net/yangshihuz/article/details/105020936
下载master二进制包
下载二进制包
1
2
3
4https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG #可以查看各个版本的下载及版本更新说明,我选择的是1.9的最后一个版本v1.9.11
master服务
- API Server:所有服务的访问入口
- scheduler:负责任务的节点选择和分配,关于多节点必要都需要调度器
- controller-manager:属于Pod的控制器,目的是维持副本的期望数量,属于冗余方案
下载包里server下4个文件复制到master上(/usr/local/bin),并授权chmod 755
kube-apiserver,kube-controller-manager,kube-scheduler,kubectl
kube-apiserver配置
1、生成基于kube-apiserver证书
基于前一篇的网络搭建的ca证书,生成kube-apiserver证书(也可以单独生成一个ca证书)
证书认证分2种:
1、授权主机认证(下面讲到的k8s-api.json文件内的hosts)
2、携带ca证书认证(对于无法携带ca证书的服务就需要使用第一种)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32cat k8s-api.json { "CN": "k8s-api", "hosts": [ "192.168.12.2", "192.168.12.3", "192.168.12.4", "192.168.12.5", "${k8s-vip}", "${k8s-res1}", "${k8s-res2}" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "SHANGHAI", "ST": "SHANGHAI" } ] } #hosts认证主机可以预留几个用变量声明。便于以后使用 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server k8s-api.json | cfssljson -bare /opt/etcd/ssl/k8s/k8s-api #-profile=server 是ca配置json中定义的 #k8s-api.json kube-apiserver生成配置 #/opt/etcd/ssl/k8s/k8s-api 指定生成的文件存放路径
2、启动kube-apiserver
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36mkdir -p /usr/local/k8s/{conf,ssl,logs} #创建k8s的工作目录 cat kube-apiserver.conf KUBE_APISERVER_OPTS="--logtostderr=false --v=2 --log-dir=/usr/local/k8s/logs --etcd-servers=https://192.168.12.10:2379,https://192.168.12.11:2379,https://192.168.12.12:2379 --bind-address=192.168.12.2 --secure-port=6443 --advertise-address=192.168.12.2 --allow-privileged=true --service-cluster-ip-range=10.0.0.0/24 --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction --authorization-mode=RBAC,Node --enable-bootstrap-token-auth=true --token-auth-file=//usr/local/k8s/conf/token.csv --service-node-port-range=30000-32767 --kubelet-client-certificate=/usr/local/k8s/ssl/k8s-api.pem --kubelet-client-key=/usr/local/k8s/ssl/k8s-api-key.pem --tls-cert-file=/usr/local/k8s/ssl/k8s-api.pem --tls-private-key-file=/usr/local/k8s/ssl/k8s-api-key.pem --client-ca-file=/usr/local/k8s/ssl/ca.pem --service-account-key-file=/usr/local/k8s/ssl/ca-key.pem --etcd-cafile=/usr/local/k8s/ssl/ca.pem --etcd-certfile=/usr/local/k8s/ssl/server.pem --etcd-keyfile=/usr/local/k8s/ssl/server-key.pem --audit-log-maxage=30 --audit-log-maxbackup=3 --audit-log-maxsize=100 --audit-log-path=/usr/local/k8s//logs/k8s-audit.log" #在conf目录下创建api的配置文件(就是kube-apiserver启动参数,最后当变量传递给systemd管理启动) #--admission-control v1.9.11是需要改成这个参数,可以--help查看 #kube-apiserver 加上面的参数尝试启动,看是否报错,但是命令使用码号不要带
kube-apiserver --help
- –logtostderr:启用日志
- —v:日志等级
- –log-dir:日志目录
- –etcd-servers:etcd集群地址
- –bind-address:监听地址
- –secure-port:https安全端口
- –advertise-address:集群通告地址
- –allow-privileged:设置为true时,kubernetes允许在Pod中运行拥有系统特权的容器应用
- –service-cluster-ip-range:Service虚拟IP地址段
- ––admission-control:准入控制模块
- –authorization-mode:认证授权,启用RBAC授权和节点自管理
- –enable-bootstrap-token-auth:启用TLS bootstrap机制
- –token-auth-file:bootstrap token文件
- –service-node-port-range:Service nodeport类型默认分配端口范围
- –kubelet-client-xxx:apiserver访问kubelet客户端证书
- –tls-xxx-file:apiserver https证书
- –etcd-xxxfile:连接Etcd集群证书
- –audit-log-xxx:审计日志
启用 TLS Bootstrapping 机制
TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。
token文件配置
1
2
3
4
5
6
7head -c 16 /dev/urandom | od -An -t x | tr -d ' ' #自动生成一个随机token cat token.csv 64c8a4bd1c2e920aa92049044b5197ba,kubelet-bootstrap,10001,"system:kubelet-bootstrap" #格式:token,用户名,UID,用户组
授权kubelet-bootstrap用户允许请求证书
1
2
3
4
5kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap #kubectl也在二进制下载的包里
创建systemd文件管理(确保上面启动没有报错)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18cat /usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/usr/local/k8s/conf/kube-apiserver.conf ExecStart=/usr/local/bin/kube-apiserver $KUBE_APISERVER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target #EnvironmentFile=环境变量文件就是conf里的配置文件kube-apiserver.conf #$KUBE_APISERVER_OPTS 变量带进去 systemctl start kube-apiserver systemctl enable kube-apiserver #启动kube-apiserver
kube-controller-manager配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17cat kube-controller-manager.conf KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false --v=2 --log-dir=/usr/local/k8s/logs --leader-elect=true --master=127.0.0.1:8080 --address=127.0.0.1 --allocate-node-cidrs=true --cluster-cidr=10.244.0.0/16 --service-cluster-ip-range=10.0.0.0/24 --cluster-signing-cert-file=/usr/local/k8s/ssl/ca.pem --cluster-signing-key-file=/usr/local/k8s/ssl/ca-key.pem --root-ca-file=/usr/local/k8s/ssl/ca.pem --service-account-private-key-file=/usr/local/k8s/ssl/ca-key.pem --experimental-cluster-signing-duration=87600h0m0s" #kube-controller-manager 加上面的参数尝试启动,看是否报错,但是命令使用码号不要带
kube-controller-manager --help
- master: Kubernetes API 服务器的地址,内部访问8080,外部暴露6443
- address:监听地址,和master一台机器上
- cluster-cidr:集群中 Pods 的范围
- service-cluster-ip-range:server服务的地址范围,同master一样
- experimental-cluster-signing-duration:自动续签kubelet client证书,默认为1年
创建systemd文件管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat /usr/lib/systemd/system/kube-controller-manager.service [Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/usr/local/k8s/conf/kube-controller-manager.conf ExecStart=/usr/local/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target systemctl start kube-controller-manager.service systemctl enable kube-controller-manager.service #启动kube-controller-manager
配置kube-scheduler
1
2
3
4
5
6
7
8cat kube-scheduler.conf KUBE_SCHEDULER_OPTS="--logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --leader-elect --master=127.0.0.1:8080 --address=127.0.0.1"
kube-scheduler --help
创建systemd文件管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat /usr/lib/systemd/system/kube-scheduler.service [Unit] Description=Kubernetes Scheduler Documentation=https://github.com/kubernetes/kubernetes [Service] EnvironmentFile=/usr/local/k8s/conf/kube-scheduler.conf ExecStart=/usr/local/bin/kube-scheduler $KUBE_SCHEDULER_OPTS Restart=on-failure [Install] WantedBy=multi-user.target systemctl start kube-scheduler.service systemctl enable kube-scheduler.service #启动kube-scheduler
查看组件状态
1
2kubectl get cs
参考:尚硅谷-k8s教程
修正1
k8s-api.json 文件编写问题
参考网上的资料是写了很多ip和域名的,但是由于我自己没有明白为什么需要,所以当初只加了节点IP,而后面搭建CoreDNS的时候终于知道为什么要加上Server的IP,不懂的可以不用加,后面遇到问题了再添加重新生成覆盖文件即可,这个有便于学习k8s的通讯机制,而变量输入测试也是无效的,所以网上资料仅仅作为参考,不能全盘抄写
最后
以上就是悦耳小丸子最近收集整理的关于k8s 二进制安装master(单master)的全部内容,更多相关k8s内容请搜索靠谱客的其他文章。
发表评论 取消回复