k8s的安装
# 单Master节点安装
> 此文档适用于k8s 1.18+,当然对于其他版本您也可以参考,注意区分每个组件的对应关系即可
## 一、服务器规划
| 主机名 | 角色 | IP | 组件 |
| -- | -- | -- | -- |
| k8s-master1 | k8s-master1| 192.168.10.151 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| k8s-master2 | k8s-master2| 192.168.10.152 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| k8s-node1 | k8s-node1| 192.168.10.153 | kubelet、kube-proxy、Docker、etcd |
|k8s-node2| k8s-node2| 192.168.10.154 | kubelet、kube-proxy、Docker、etcd |
|ha1| load balancer(Master)| 192.168.10.155 | Nginx L4 |
|ha2| load balancer(Backup)| 192.168.10.156 | Nginx L4 |
|| VIP(虚拟IP)| 192.168.10.150 ||
> IP地址、主机名可自行规划成自己的
软件列表
| 软件名称 | 版本 | 备注 |
| :--------: | :--------------: | :-------: |
| CentOS7 | kernel版本:5.17 | |
| kubernetes | v1.20.0 | |
| etcd | v3.4.13 | 最新版本 |
| calico | v3.19.4 | |
| coredns | v1.8.4 | |
| containerd | 2001.6.1 | |
| runc | 1.1.0 | |
| haproxy | 5.18 | YUM源默认 |
| keepalived | 3.5 | YUM源默认 |
## 二、系统初始化
### 2.1.1 主机名设置
```shell
hostnamectl set-hostname xxx
```
> xxx参考上文的规划表
### 2.1.2 主机与IP地址解析
```shell
cat >> /etc/hosts << EOF
192.168.10.155 ha1
192.168.10.156 ha2
192.168.10.151 k8s-master1
192.168.10.152 k8s-master2
192.168.10.153 k8s-node1
192.168.10.154 k8s-node2
EOF
```
> IP地址参考上文规划表,所有节点都需要,我们是通过主机名通信的,node可以不添加,但是master必须添加
### 2.1.3 关闭防火墙
```shell
systemctl stop firewalld
systemctl disable firewalld
firewall-cmd --state
```
> 防火墙可以只开放需要的端口即可,直接关掉主要是避免学习中出现更多的问题
systemctl disable --now firewalld
systemctl disable --now dnsmasq
systemctl disable --now NetworkManager
### 2.1.4 关闭selinux
```shell
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus
```
> selinux是Linux的一种安全机制,主要是限制文件的上下文权限是否可访问等,关掉便于我们学习
### 2.1.5 关闭swap分区
```shell
swapoff -a && sysctl -w vm.swappiness=0
sed -ri 's/.*swap.*/#&/' /etc/fstab
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p
```
> swapoff -a 临时关闭
vi /etc/fstab # 将swap那行注释掉,即永久关闭
k8s不使用swap,它认为swap开销比较大,性能会大幅度降低,作为云产品来说,使用swap作为基础架构,会减少性能,所以k8s需要关闭swap,装系统的时候就可以不用swap分区了。
### 2.1.6 主机系统时间同步
```shell
yum -y install ntpdate
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo 'Asia/Shanghai' >/etc/timezone
ntpdate time2.aliyun.com
# 加入到crontab
crontab -e
*/5 * * * * ntpdate time2.aliyun.com # 输入此行
```
> 可以使用ntpdate time.windows.com 同步windows服务器的时间,如果不能连外网可以使用内网的时钟服务器进行同步,必须保证时间同步,避免因为时间不同步,导致证书校验不成功。
这里Centos是最小化安装,所以没有ntpdate这个软件,需要安装、安装完成后:制定时间同步计划任务
### 2.1.7 所有节点配置limit
ulimit -SHn 65535
```shell
# vi /etc/security/limits.conf
# 末尾添加如下内容
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock umlimited
```
### 2.1.8 免密
> Master01节点免密钥登录其他节点,安装过程中生成配置文件和证书均在Master01上操作,集群管理也在Master01上操作,阿里云或者AWS.上需要单独一台kubectl服务器。密钥配置如下:
```shell
ssh-kengey -t rsa
```
Master01免密登录到其他节点
```shell
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node1 k8s-node2;do ssh-copy-id -i .ssh/id_rsa.pub $i;done
注:在Root的~目录下
```
### 2.1.9 下载工具包
```shell
在这个连接里进行下载:https://github.com/dotbalo/k8s-ha-install,将其传到/root目录下
```
### 2.1.10 配置yum源(可选)
```shell
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manage --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
```
### 2.1.11 可能用到工具安装
```shell
yum install -y wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git
```
### 2.1.12 系统升级
所有节点升级系统并重启
```shell
yum update -y exclude=kernel* && reboot
# Centos7需要升级,centos8可以按需升级
```
### 2.1.13 内核升级
CentOS7需要升级内核至4.18+,本地升级的版本为4.19
**在Master01节点上下载内核**
```shell
cd /root
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-4.19.12-1.el7.elrepo.x86_64.rpm
wget http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.19.12-1.el7.elrepo.x86_64.rpm
```
**从master01节点传到其他节点**
```shell
for i in k8s-master01 k8s-master02 k8s-master03 k8s-node1 k8s-node2;do scp kernel-ml-* $i:/root/;done
```
**所有节点安装内核**
`cd /root && yum localinstall -y kernel-ml*`
所有节点更改内核启动顺序
```shell
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
```
**默认内核不是4.19**
```shell
grubby --default-kernel
# /boot/vmliuz-4.19.12-1.el7.elrepo.x86_64
**所有节点重启,然后检查内核是不是4.19**
uname -a
```
**所有节点安装ipvsadm**
`yum install ipvsadm ipset sysstat conntrack libseccomp -y`
所有节点配置IPVS模块,在内核4.19+版本nf_conntrack_ipv4已经改成了nf_conntrack,4.18版本以下使用nf_conntrack_ipv4即可
```shell
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack_ipv4"
for kernel_module in \${ipvs_modules}; do
/sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe \${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
```
然后执行 `systemctl enable --now systemd-modules-load.service` 即可
> 这里使用的是IPvs实现的负载均衡,它比IPtables效率高的
检查是否加载:
```shell
lsmod | grep -e ip_vs -e nf_conntrack
```
```shell
[root@k8s-master1 ~]# lsmod | grep -e ip_vs -e nf_conntrack
ip_vs_ftp 16384 0
nf_nat 32768 1 ip_vs_ftp
ip_vs_sed 16384 0
ip_vs_nq 16384 0
ip_vs_fo 16384 0
ip_vs_sh 16384 0
ip_vs_dh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs_wlc 16384 0
ip_vs 151552 18 ip_vs_wlc,ip_vs_rr,ip_vs_dh,ip_vs_sh,ip_vs_fo,ip_vs_nq,ip_vs_wrr,ip_vs_sed,ip_vs_ftp
nf_conntrack 143360 2 nf_nat,ip_vs
nf_defrag_ipv6 20480 1 nf_conntrack
nf_defrag_ipv4 16384 1 nf_conntrack
libcrc32c 16384 4 nf_conntrack,nf_nat,xfs,ip_vs
```
> 没有加载重启后在试试,加载如上
开启一些k8s集群中必须的内核参数,所有节点配置k8s内核:
```shell
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forword = 1
net.bridge-nf-call-iptables=1
net.bridge-nf-call-ip6tables=1
fs.may_detach_mounts=1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipy4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
sysctl --system
```
所有节点配置完内核后,重启服务器,保证重启后内核依旧加载
```shell
reboot
lsmod | grep --color=auto -e ip_vs -e nf_conntrack
```
### 2.1.14 基本组件的安装
> 此节主要安装集群中用到的各类组件如Docker-ce、Kubernetes各组件等。
#### 所有节点安装Docker-ce 19.03
`yum install -y docker-ce-19.03`
> 由于新版的kubelet建议使用systemd,所以可以把docker的CgroupDriver改成systemd
```shell
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF
```
所有节点设置开机自启动Docker:
`systemctl daemon-reload && systemctl enable --now docker`
> 安装可能报错,找不到或没有匹配的包
#step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
#Step 4: 开启Docker服务
sudo service docker start
#注意:
#官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
#vim /etc/yum.repos.d/docker-ce.repo
#将[docker-ce-test]下方的enabled=0修改为enabled=1
#安装指定版本的Docker-CE:
#Step 1: 查找Docker-CE的版本:
#yum list docker-ce.x86_64 --showduplicates | sort -r
#Loading mirror speeds from cached hostfile
#Loaded plugins: branch, fastestmirror, langpacks
#docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
#docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
#docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
#Available Packages
#Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
#sudo yum -y install docker-ce-[VERSION]
#### k8s 和 etcd 的安装
master01 下载kubernetes安装包
```shell
wget https://dl.k8s.io/v1.20.0/kubernetes-server-linux-amd64.tar.gz
# 可以在github上查找,或下载最新版:https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
# 打开对于的CHANGELOG-1.xx.md后,点击Server Binaries,再点击filename下的第一格就可以了
```
master01 下载 etcd 安装包
```shell
wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
```
**解压kubernetes安装文件**
```shell
tar -xf kubernetes-server-linux-amd64.tar.gz --strip-components=3 -C /usr/local/bin kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}
```
**解压 etcd 安装文件**
```shell
tar -zxvf etcd-v3.4.13-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin etcd-v3.4.13-linux-amd64/etcd{,ctl}
```
**版本查看**
```shell
kubelet --version
etcdctl version
```
```shell
查看结果
[root@k8s-master1 liulike]# kubelet --version
Kubernetes v1.20.15
[root@k8s-master1 liulike]# kubelet --version
Kubernetes v1.20.15
```
#### 将组件发送到其他节点
```shell
MasterNodes='k8s-master2'
WorkNodes='k8s-node1 k8s-node2'
for NODE in $MasterNodes;do echo $NODE;
scp /usr/local/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy} $NODE:/usr/local/bin/;scp /usr/local/bin/etcd* $NODE:/usr/local/bin/;done
for NODE in $WorkNodes;do echo $NODE;
scp /usr/local/bin/kube{let,-proxy} $NODE:/usr/local/bin/;
done
```
**所有节点创建/opt/cni/bin目录**
`mkdir -p /opt/cni/bin`
切换分支:
切换到1.20.x(其他版本可以切换到其他分支)
```shell
cd k8s-ha-install && checkout manual-installation-v1.20.x
```
> 查看有哪些分支:
git branch -a
需要在k8s-ha-install目录
## 三、etcd数据库集群部署
> 在Master1上操作
> ETCD是什么:
它是coreos开源的一个key/value系统,主要用与服务的注册发现和共享配置,随着coreos和k8s的快速发展,etcd现在也作为k8s的存储,etcd是由多个节点相互构建的整体对外服务的,每个节点都有完整的数据,通过raft协议保证数据强一致性,官方推荐节点为3、5、7这种基数的节点。会选取节点作为主节点作写的操作,当它写完后会同步到其他节点,当主节点挂掉后会重新选取主节点,这也是为什么需要奇数个节点,它是为了当主节点挂掉后,还能选出一个主节点出来。
集群是怎么组成的
### 3.1 自签etcd ssl证书
> k8s通信基本上都是https,所以需要用到证书、etcd集群和k8s集群采用不同的两套证书进行校验,k8s的证书主要是给apiserver颁发的,因为其他的工具是对接的APIserver的。
k8s网上的教程基本上都是采用了证书的,不采用证书也能部署,可能教程会比较少,建议使用正式,保证通信安全
#### 3.1.1 获取cfssl工具
```shell
https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
```
> 说明:
cfssl是使用go编写,由CloudFlare开源的一款PKI/TLS工具。主要程序有:
· cfssl,是CFSSL的命令行工具
· cfssljson用来从cfssl程序获取JSON输出,并将证书,密钥,CSR和bundle写入文件中。
**为了方便使用,我们修改文件名:**
```shell
for x in cfssl*; do mv $x ${x%*_linux-amd64}; done
```
**添加可执行权限**
```shell
chmod +x cfssl*
```
**移动到/usr/local/bin/**
```shell
mv cfssl* /usr/local/bin/
```
> 终端输入cfssl version出现以下内容,表示安装成功:
[root@master opt]# cfssl version
Version: 1.2.0
Revision: dev
Runtime: go1.6
> 注:移动不是必须的,使用的时候只要能定位到相关的文件,能够使用它即可
#### 证书的签发,请查看[k8s-证书](doc:CAK4XKEa)
自签证书的过程中需要的json请参考[k8s-证书相关json集合](doc:7UFvS2k0)
---
# =========== 以下暂不使用 ================
3.1.2 创建CA证书
**配置ca证书请求文件**
```shell
cat > ca-csr.json <<"EOF"
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "kubemsb",
"OU": "CN"
}
],
"ca": {
"expiry": "87600h"
}
}
EOF
```
**自建ca证书**
```shell
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
```
配置ca证书策略
```shell
cat > ca-config.json <<"EOF"
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
```
> expiry:过期时间
server auth 表示client可以对使用该ca对server提供的证书进行验证
client auth 表示server可以使用该ca对client提供的证书进行验证
```shell
cfssl print-defaults config > ca-config.json
```
#### 3.1.3 创建etcd证书
**配置etcd请求文件**
```shell
cat > etcd-csr.json <<"EOF"
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"192.168.10.151",
"192.168.10.152",
"192.168.10.153",
"192.168.10.154"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "kubemsb",
"OU": "CN"
}]
}
EOF
```
> CN:名字
hosts:可信IP,将相关的IP填入,它是包含所有etcd节点的IP
key:密钥相关,algo:加密算法、size:长度
name证书的属性信息,国家、城市
**生成etcd证书**
```shell
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
```
**查看**
使用ls能够看到如下内容:
```shell
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem etcd.csr etcd-csr.json etcd-key.pem etcd.pem
```
> 这些内容是后面需要用的:ca-key.pem ca.pem etcd-key.pem etcd.pem
## 四、部署Master组件
> 1.kube-apiserver:整个集群的入口,当它启动后,其他的才能启动
2.kube-controller- manager
3.kube-scheduler
配置文件-> systemd管理组件->启动
### 4.1 签发k8s的证书
> k8s是基于https进行通信的,所以还得为k8s签发证书
在其他的放进行此步操作,或者新建个目录进行操作即可
这里在/opt目录下创建一个k8s-server的目录进行操作
```shell
# master最后结构
kubenetes
├── bin
│ ├── apiextensions-apiserver
│ ├── kube-controller-manager
│ ├── kubectl
│ └── kube-scheduler
├── cfg
│ └── token.csv
│ └── kube-apiserver.conf
│ └── kube-controller-manager.conf
│ └── kube-scheduler.conf
├── logs
└── ssl
```
**新建目录**
```shell
mkdir /opt/k8s-server
```
将原来的ca-config.json、ca-csr.json复制到当前新建的文件夹
```shell
cp /opt/ca-csr.json ./
cp /opt/ca-csr.json ./
```
执行`cfssl gencert -initca ca-csr.json | cfssljson -bare ca - `自建证书
#### 4.1.1 创建apiserver证书请求文件
```shell
cat > kube-apiserver-csr.json << "EOF"
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168.10.151",
"192.168.10.152",
"192.168.10.155",
"192.168.10.156",
"192.168.10.157",
"192.168.10.159",
"192.168.10.160",
"192.168.10.150",
"10.10.0.1",
"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": "kubemsb",
"OU": "CN"
}
]
}
EOF
```
> 说明:
如果 hosts 字段不为空则需要指定授权使用该证书的 IP(含VIP,即包含虚拟IP) 或域名列表。由于该证书被集群使用,需要将节点的IP都填上,为了方便后期扩容可以多写几个预留的IP。
同时还需要填写 service 网络的首个IP(一般是 kube-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.10.0.1)。
Node 的IP可不写
**生成apiserver证书及token文件**
```shell
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-apiserver-csr.json | cfssljson -bare kube-apiserver
```
```shell
cat > token.csv << EOF
$(head -c 16 /dev/urandom | od -An -t x | tr -d ' '),kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
```
> 说明:
创建TLS机制所需TOKEN
TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。
#### 4.1.2 创建kube-proxy证书请求文件
```shell
cat > kube-proxy-csr.json << "EOF"
{
"CN": "system:kube-proxy",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "kubemsb",
"OU": "CN"
}
]
}
EOF
```
**生成证书**
```shell
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
```
```shell
# ls kube-proxy*
kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem
```
# test
## 创建apiserver服务配置文件
```shell
cat > /opt/master/cfg/kube-apiserver.conf << "EOF"
KUBE_APISERVER_OPTS="--enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \
--anonymous-auth=false \
--bind-address=192.168.10.12 \
--secure-port=6443 \
--advertise-address=192.168.10.12 \
--insecure-port=0 \
--authorization-mode=Node,RBAC \
--runtime-config=api/all=true \
--enable-bootstrap-token-auth \
--service-cluster-ip-range=10.96.0.0/16 \
--token-auth-file=/etc/kubernetes/token.csv \
--service-node-port-range=30000-32767 \
--tls-cert-file=/etc/kubernetes/ssl/kube-apiserver.pem \
--tls-private-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--kubelet-client-certificate=/etc/kubernetes/ssl/kube-apiserver.pem \
--kubelet-client-key=/etc/kubernetes/ssl/kube-apiserver-key.pem \
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-account-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--service-account-issuer=api \
--etcd-cafile=/etc/etcd/ssl/ca.pem \
--etcd-certfile=/etc/etcd/ssl/etcd.pem \
--etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \
--etcd-servers=https://192.168.10.12:2379,https://192.168.10.13:2379,https://192.168.10.14:2379 \
--enable-swagger-ui=true \
--allow-privileged=true \
--apiserver-count=3 \
--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=4"
EOF
```
> kube-apiserver.conf 部分注解:
--enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota:启用准入控制插件,k8s的高级的功能会启用,如:资源配额的限制、Node的自动注册……
--anonymous-auth=false:
--bind-address=192.168.10.12:当前api server监听的内网IP(多网卡也是监听的内网IP)
--secure-port=6443:监听的端口
--advertise-address=192.168.10.12:通告的地址,通常与绑定地址一样,作用是通告node通过哪个IP连接APIserver
--insecure-port=0 \
--authorization-mode=Node,RBAC:授权的模式,为指定用户赋予相应的权限,RBAC基于角色的认证、Node:自动注册到k8s
--runtime-config=api/all=true \
--enable-bootstrap-token-auth:token认证,早期为了能够为node自动颁发证书引用的bootstrap的机制,颁发证书会请求API
--service-cluster-ip-range=10.96.0.0/16:server的IP范围,虚拟IP从这里分配出来
--token-auth-file=/etc/kubernetes/token.csv:token文件的路径
--service-node-port-range=30000-32767:应用暴露的端口范围,默认这些
--tls-cert-file=/etc/kubernetes/ssl/kube-apiserver.pem:kubernetes证书的路径
--tls-private-key-file=/etc/kubernetes/ssl/kube-apiserver-key.pem:kubernetes证书密钥的路径
============== 配置API 使用https时使用的证书 ======================
--kubelet-client-certificate=/etc/kubernetes/ssl/kube-apiserver.pem \
--kubelet-client-key=/etc/kubernetes/ssl/kube-apiserver-key.pem \
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-signing-key-file=/etc/kubernetes/ssl/ca-key.pem:server-count使用的私钥
=============== 连接etcd所使用的证书 =============================
--service-account-issuer=api \
--etcd-cafile=/etc/etcd/ssl/ca.pem \
--etcd-certfile=/etc/etcd/ssl/etcd.pem \
--etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \
=============================================================
--etcd-servers=https://192.168.10.12:2379,https://192.168.10.13:2379,……:etcd server的配置
--enable-swagger-ui=true \
--allow-privileged=true:允许容器有宿主机一样的权限
--apiserver-count=3 \
======================== 日志的审计 ============================
--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=4:日志级别,有0-8个日志级别
|详细等级|描述|
|:-:|:-:|
|--v=0| 总是对操作人员可见 |
|--v=1| 合理的默认日志级别,如果您不需要详细输出 |
|--v=2|可能与系统的重大变化相关的,有关稳定状态的信息和重要的日志信息。这是对大多数系统推荐的日志级别|
|--v=3|有关更改的扩展信息|
|--v=4|调试级别详细输出|
|--v=6|显示请求的资源|
|--v=7|显示HTTP请求的Header|
|--v=8|显示HTTP请求的内容|
## 创建kube-controller-manager配置文件
```shell
cat > kube-controller-manager.conf << "EOF"
KUBE_CONTROLLER_MANAGER_OPTS="--port=10252 \
--secure-port=10257 \
--bind-address=127.0.0.1 \
--kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
--service-cluster-ip-range=10.96.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--allocate-node-cidrs=true \
--cluster-cidr=10.244.0.0/16 \
--experimental-cluster-signing-duration=87600h \
--root-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
--leader-elect=true \
--feature-gates=RotateKubeletServerCertificate=true \
--controllers=*,bootstrapsigner,tokencleaner \
--horizontal-pod-autoscaler-use-rest-clients=true \
--horizontal-pod-autoscaler-sync-period=10s \
--tls-cert-file=/etc/kubernetes/ssl/kube-controller-manager.pem \
--tls-private-key-file=/etc/kubernetes/ssl/kube-controller-manager-key.pem \
--use-service-account-credentials=true \
--alsologtostderr=true \
--logtostderr=false \
--log-dir=/var/log/kubernetes \
--v=2"
EOF
```
> kube-controller-manager.conf 注解:
--master=127.0.0.1:8080:APIserver的IP
--port=10252 \
--secure-port=10257 \
--bind-address=127.0.0.1 \
--kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \
--service-cluster-ip-range=10.96.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \
--allocate-node-cidrs=true \
--cluster-cidr=10.244.0.0/16 \
--experimental-cluster-signing-duration=87600h \
--root-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \
--leader-elect=true:做集群的选举
--feature-gates=RotateKubeletServerCertificate=true \
--controllers=*,bootstrapsigner,tokencleaner \
--horizontal-pod-autoscaler-use-rest-clients=true \
--horizontal-pod-autoscaler-sync-period=10s \
--tls-cert-file=/etc/kubernetes/ssl/kube-controller-manager.pem \
--tls-private-key-file=/etc/kubernetes/ssl/kube-controller-manager-key.pem \
--use-service-account-credentials=true \
--alsologtostderr=true \
========== 配置日志 ==============
--logtostderr=false \
--log-dir=/var/log/kubernetes \
--v=2"
```
## 创建服务配置文件
```shell
cat > kube-scheduler.conf << "EOF"
KUBE_SCHEDULER_OPTS="--address=127.0.0.1 \
--kubeconfig=/etc/kubernetes/kube-scheduler.kubeconfig \
--leader-elect=true \
--alsologtostderr=true \
--logtostderr=false \
--log-dir=/var/log/kubernetes \
--v=2"
EOF
```