环境准备
在这里插入图片描述

  1. 关闭防火墙和selinux
  2. 关闭swap分区
    swap分区会影响到容器
  3. 设置hosts
    可以把服务器都是设置成域名的方式,以便日后的ip更改
  4. 设置桥接的IPv4流量传递到iptables的链
    由于网桥工作于数据链路层,在iptables没有开启 bridge-nf时,数据会直接经过网桥转发,结果就是对FORWARD的设置失效,centos默认不开启 bridge-nf
  5. 集群时间同步
    集群需要时间的同步,避免发生未知错误

关闭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 加上面的参数尝试启动,看是否报错,但是命令使用码号不要带

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文件配置

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"

kube-scheduler --help

创建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的通讯机制,而变量输入测试也是无效的,所以网上资料仅仅作为参考,不能全盘抄写

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐