k8s 二进制安装master(单master)
环境准备关闭防火墙和selinux关闭swap分区swap分区会影响到容器设置hosts可以把服务器都是设置成域名的方式,以便日后的ip更改设置桥接的IPv4流量传递到iptables的链由于网桥工作于数据链路层,在iptables没有开启 bridge-nf时,数据会直接经过网桥转发,结果就是对FORWARD的设置失效,centos默认不开启 bridge-nf集群时间同步集群需要时间的同步,避
环境准备
- 关闭防火墙和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的链
cat > /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二进制包
下载二进制包
https://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证书的服务就需要使用第一种)
cat 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
mkdir -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 加上面的参数尝试启动,看是否报错,但是命令使用码号不要带
- –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文件配置
head -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用户允许请求证书
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
#kubectl也在二进制下载的包里
创建systemd文件管理(确保上面启动没有报错)
cat /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配置
cat 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文件管理
cat /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
cat 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"
创建systemd文件管理
cat /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
查看组件状态
kubectl get cs
参考:尚硅谷-k8s教程
修正1
k8s-api.json 文件编写问题
参考网上的资料是写了很多ip和域名的,但是由于我自己没有明白为什么需要,所以当初只加了节点IP,而后面搭建CoreDNS的时候终于知道为什么要加上Server的IP,不懂的可以不用加,后面遇到问题了再添加重新生成覆盖文件即可,这个有便于学习k8s的通讯机制,而变量输入测试也是无效的,所以网上资料仅仅作为参考,不能全盘抄写
更多推荐
所有评论(0)