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 ```