k8s 1.17.3 二进制部署

这篇博客详细介绍了如何在裸机环境中以二进制方式部署Kubernetes 1.17.3,涵盖了从环境准备、内核升级、系统参数调整到安装docker,直至配置和部署etcd集群、kubernetes组件、网络插件等全过程。
摘要由CSDN通过智能技术生成

K8s简介

Kubernetes(简称k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现、扩容缩容、监控,维护等一整套功能。,努力成为跨主机集群的自动部署、扩展以及运行应用程序容器的平台。 它支持一系列容器工具, 包括Docker等。

# kubernetes

本文档是kubernetes1.17.3二进制安装的第一篇

注意 本文所有操作均在所有节点执行

本文环境

名称 配置
Kubernetes版本 v1.17.3
Cluster Pod CIDR 10.244.0.0/16
Cluster Service CIDR 10.250.0.0/24
kubernetes service 10.250.0.1
dns service 10.250.0.10

本文档主要介绍在裸机环境下以二进制的方式安装部署kubernetes

本次文档主要是对于kubernetes 1.17.3版本

内容主要有环境准备安装配置docker 升级内核 调整系统参数

环境准备

主机名 IP 组件 配置
k8s-master1 200.200.100.71 etcd、apiserver、controller-manager、schedule、kube-proxy、kubelet、docker-ce 2核 4G
k8s-master2 200.200.100.72 etcd、apiserver、controller-manager、schedule、kube-proxy、kubelet、docker-ce 2核 4G
k8s-master3 200.200.100.73 kube-proxy、kubelet、docker-ce 2核 4G
k8s-node1 200.200.100.74 kube-proxy、kubelet、docker-ce 2核 4G

以下操作除非具体说明的步骤 其他的均在所有节点执行

环境变量

此环境变量为主节点(控制节点)的主机名和IP地址

export VIP=200.200.100.70
export MASTER1_HOSTNAME=k8s-master1
export MASTER1_IP=200.200.100.71
export MASTER2_HOSTNAME=k8s-master2
export MASTER2_IP=200.200.100.72
export MASTER3_HOSTNAME=k8s-master3
export MASTER3_IP=200.200.100.73
export NODE1_HOSTNAME=k8s-node1
export NODE1_IP=200.200.100.74

SSH免密/时间同步/主机名修改

· SSH免密

· NTP时间同步

· 主机名修改

· 环境变量生成

· Host 解析

这里需要说一下,所有的密钥分发以及后期拷贝等都在master1上操作,因为master1做免密了

k8s集群所有的机器都需要进行host解析

cat >> /etc/hosts << EOF
200.200.100.71 k8s-master1
200.200.100.72 k8s-master2
200.200.100.73 K8s-master3
200.200.100.74 k8s-node1
EOF

批量免密

# 做免密前请修改好主机名对应的host

yum -y install expect
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
for i in 200.200.100.71 200.200.100.72 200.200.100.73 200.200.100.74 k8s-master1 k8s-master2 k8s-master3 k8s-node1;do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
    expect {
        \"*yes/no*\" {send \"yes\r\"; exp_continue}
        \"*password*\" {send \"Bscadmin@8037\r\"; exp_continue}
        \"*Password*\" {send \"Bscadmin@8037\r\";}
    } "
done 

切记所有机器需要自行设定ntp,否则不只HA下apiserver通信有问题,各种千奇百怪的问题。

yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
ntpdate -u time1.aliyun.com
hwclock --systohc
timedatectl set-timezone Asia/Shanghai

批量修改主机名

ssh 200.200.100.71 "hostnamectl set-hostname k8s-master1" &&
ssh 200.200.100.72 "hostnamectl set-hostname k8s-master2" &&
ssh 200.200.100.73 "hostnamectl set-hostname k8s-master3"  &&
ssh 200.200.100.74 "hostnamectl set-hostname k8s-node1" 

执行完毕bash刷新一下即可

测试通信

for i in  k8s-master1 k8s-master2 k8s-master3 k8s-node1 ; do ssh root@$i "hostname";done

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PmojhQEB-1585795323615)(E:/BaiduYunDownload/桌面文件/k8s/k8s1.17.3部署/kubernetes/A-Kubernetes部署/v1.17.3二进制安装/image/ktest-shh.gif)]

升级内核

安装内核语言编译器(内核是用perl语言编写的)

yum -y install perl

下载密钥和yum源

导入密钥

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

安装7版本的yum源文件

yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

安装 ml版本 5版本的内核名字叫ml

yum  --enablerepo="elrepo-kernel"  -y install kernel-ml.x86_64

附:4.4版本内核安装方法

yum   --enablerepo="elrepo-kernel" -y install kernel-lt.x86_64

然后配置从新的内核启动

grub2-set-default 0

然后重新生成grub2.cfg 使虚拟机使用新内核启动

grub2-mkconfig -o /boot/grub2/grub.cfg

调整系统内核参数

cat > /etc/sysctl.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

然后执行sysctl -p 使配置的内核响应参数生效

sysctl -p

关闭防火墙、selinux、swap、NetworkManager

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
systemctl stop NetworkManager
systemctl disable NetworkManager

修改资源限制

echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536"  >> /etc/security/limits.conf
echo "* hard nproc 65536"  >> /etc/security/limits.conf
echo "* soft memlock unlimited"  >> /etc/security/limits.conf
echo "* hard memlock unlimited"  >> /etc/security/limits.conf

常用软件安装

yum -y install bridge-utils chrony ipvsadm ipset sysstat conntrack libseccomp wget tcpdump screen vim nfs-utils bind-utils wget socat telnet sshpass net-tools sysstat lrzsz yum-utils device-mapper-persistent-data lvm2 tree nc lsof strace nmon iptraf iftop rpcbind mlocate ipvsadm

加载内核ipvs模块

cat > /etc/sysconfig/modules/ipvs.modules <<EOF

#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

安装docker-ce:

添加yun源

tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
[aliyun-docker-ce]
name=aliyun-docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
enable=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
EOF

安装docker-ce

yum -y install docker-ce

重启docker并设置为开机自启

systemctl daemon-reload
systemctl restart docker
systemctl enable docker

然后重启系统 验证内核是否升级成功

下载命令

下载cfssl以及cfssljson命令

此举目的是下载创建证书以及配置文件需要的命令

PKI基础概念

什么是PKI?

公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。(节选维基百科)

PKI是借助CA(权威数字证书颁发/认证机构)将用户的个人身份跟公开密钥链接在一起,它能够确保每个用户身份的唯一性,这种链接关系是通过注册和发布过程实现,并且根据担保级别,链接关系可能由CA和各种软件或在人为监督下完成。PKI用来确定链接关系的这一角色称为RA(Registration Authority, 注册管理中心),RA能够确保公开密钥和个人身份链接,可以防抵赖,防篡改。在微软的公钥基础建设下,RA又被称为CA,目前大多数称为CA。

PKI组成要素

从上面可以得知PKI的几个主要组成要素,用户(使用PKI的人或机构),认证机构(CA,颁发证书的人或机构),仓库(保存证书的数据库)等。

非对称加密

本文提到的密钥均为非对称加密,有公钥和私钥之分,并且他们总是成对出现,它们的特点就是其中一个加密的数据,只能使用另一个解密,即使它本身也无法解密,也就是说公钥加密的,私钥可以解密,私钥加密的,公钥可以解密。

证书签名请求CSR

它是向CA机构申请数字证书时使用的请求文件,这里的CSR不是证书,而向权威证书颁发机构获得签名证书的申请,当CA机构颁发的证书过期时,你可以使用相同的CSR来申请新的证书,此时key不变。

数字签名

数字签名就是“非对称加密+摘要算法”,其目的不是为了加密,而是为了防抵赖或者他们篡改数据。其核心思想是:比如A要给B发送数据,A先用摘要算法得到数据的指纹,然后用A的私钥加密指纹,加密后的指纹就是A的签名,B收到数据和A的签名后,也用同样的摘要算法计算指纹,然后用A公开的公钥解密签名,比较两个指纹,如果相同,说明数据没有被篡改,确实是A发过来的数据。假设C想改A发给B的数据来欺骗B,因为篡改数据后指纹会变,要想跟A的签名里面的指纹一致,就得改签名,但由于没有A的私钥,所以改不了,如果C用自己的私钥生成一个新的签名,B收到数据后用A的公钥根本就解不开。(来源于网络)

数字证书格式

数字证书格式有很多,比如.pem,.cer或者.crt等。

PKI工作流程

下图来源于网络,上半部分最右边就是CA机构,可以颁发证书。证书订阅人,首先去申请一个证书,为了申请这个证书,需要去登记,告诉它,我是谁,我属于哪个组织,到了登记机构,再通过CSR,发送给CA中心,CA中心通过验证通过之后 ,会颁发一对公钥和私钥,并且公钥会在CA中心存一份;证书订阅人拿到证书以后,部署在服务器;

当用户访问我们的web服务器时,它会请求我们的证书,服务器会把公钥发送给我们的客户端,客户端会去验证我们证书的合法性,客户端是如何验证证书是否有效呢?CA中心会把过期证书放在CRL服务器上面 ,这个CRL服务会把所有过期的证书形成一条链条,所以他的性能非常的差,所以又推出了OCSP程序,OCSP可以就一个证书进行查询,它是否过期,浏览器可以直接去查询OCSP响应程序,但OCSP响应程序效率还不是很高,最终往往我们会把web服务器如nginx有一个ocsp开关,当我们打开这个开关以后,会有nginx服务器主动的去ocsp服务器去查询,这样大量的客户端直接从web服务器就可以直接获取到证书是否有效。

CFSSL介绍

CFSSL是什么?

cfssl是使用go编写,由CloudFlare开源的一款PKI/TLS工具。主要程序有cfssl,是CFSSL的命令行工具,cfssljson用来从cfssl程序获取JSON输出,并将证书,密钥,CSR和bundle写入文件中。

安装CFSSL

可能下载时间较长

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
cfssl version

版本应该是1.2.0及以上版本

显示信息

Version: 1.2.0
Revision: dev
Runtime: go1.6

生成证书

注意 本文所有操作均在master1节点执行

主要内容为生成kubernetes集群所需要的各种证书

主要有两个部分 生成etcd的证书 和生成kubernetes组件的证书

生成etcd证书

1 创建生成证书和临时存放证书的目录

mkdir /root/ssl/{etcd,kubernetes} -p

进入etcd目录

cd /root/ssl/etcd/

2 创建用来生成CA文件的JSON配置文件

此CA文件只用与etcd的证书

cat << EOF | tee ca-config.json
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "etcd": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

server auth 表示client可以对使用该ca对server提供的证书进行验证

client auth 表示server可以使用该ca对client提供的证书进行验证

3 创建用来生成CA证书签名请求(CSR)的JSON配置文件

cat << EOF | tee ca-csr.json
{
    "CN": "etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

4 生成CA证书和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

输出内容

2019/10/12 19:35:14 [INFO] generating a new CA key and certificate from CSR
2019/10/12 19:35:14 [INFO] generate received request
2019/10/12 19:35:14 [INFO] received CSR
2019/10/12 19:35:14 [INFO] generating key: rsa-2048
2019/10/12 19:35:14 [INFO] encoded CSR
2019/10/12 19:35:14 [INFO] signed certificate with serial number 76399392328271693420688681207409409662642174207

查看生成的CA证书和私钥

ls ca*.pem

输出内容

ca-key.pem  ca.pem

5 创建etcd证书请求

cat << EOF | tee etcd-csr.json
{
    "CN": "etcd",
    "hosts": [
      "200.200.100.71",
      "200.200.100.72",
      "200.200.100.73"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}
EOF

6 生成etcd证书和私钥

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=etcd etcd-csr.json | cfssljson -bare etcd

输出内容

2019/10/12 19:39:16 [INFO] generate received request
2019/10/12 19:39:16 [INFO] received CSR
2019/10/12 19:39:16 [INFO] generating key: rsa-2048
2019/10/12 19:39:17 [INFO] encoded CSR
2019/10/12 19:39:17 [INFO] signed certificate with serial number 276878925110307603699002043209122885766807800060
2019/10/12 19:39:17 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").

7 查看生成的所有etcd证书

ls | grep pem

输出的4个文件

ca-key.pem
ca.pem
etcd-key.pem
etcd.pem

生成kubernetes组件证书

切换到kubernetes组件证书申请和存放目录

 cd /root/ssl/kubernetes/

新建CA配置文件

用于kubernetes集群的组件和admin角色

cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "8760h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

新建CA凭证签发请求文件

cat > ca-csr.json <<EOF
{
  "CN": "Kubernetes",
  "hosts": [
    "127.0.0.1",
    "200.200.100.71",
    "200.200.100.72",
    "200.200.100.73",
    "200.200.100.70"
 ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "Kubernetes",
      "OU": "Beijing",
      "ST": "Beijing"
    }
  ]
}
EOF

生成CA凭证和私钥

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

输出信息

2019/10/12 19:56:26 [INFO] generating a new CA key and certificate from CSR
2019/10/12 19:56:26 [INFO] generate received request
2019/10/12 19:56:26 [INFO] received CSR
2019/10/12 19:56:26 [INFO] generating key: rsa-2048
2019/10/12 19:56:26 [INFO] encoded CSR
2019/10/12 19:56:26 [INFO] signed certificate with serial number 679742542757179200541008226092035525850208663173

查看创建的证书和私钥

ls ca*.pem

输出文件

ca-key.pem  ca.pem

client与server凭证

创建admin client 凭证签发请求文件

cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "system:masters",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

创建admin client 凭证和私钥

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=kubernetes \
  admin-csr.json | cfssljson -bare admin

输出信息

2019/10/12 19:59:38 [INFO] generate received request
2019/10/12 19:59:38 [INFO] received CSR
2019/10/12 19:59:38 [INFO] generating key: rsa-2048
2019/10/12 19:59:38 [INFO] encoded CSR
2019/10/12 19:59:38 [INFO] signed certificate with serial number 514625224786356937263551808946632861542829130401
2019/10/12 19:59:38 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").

查看生成的文件

ls admin*.pem

admin-key.pem  admin.pem

生成kubelet客户端凭证

kubernetes使用special-purpose authorization mode(被称作 Node Authorizer) 授权来自kubelet的API请求

为了通过Node Authorizer的授权,kubelet 必须使用一个署名为system:node:的凭证来证明它属于system:nodes用户组。

本节将会给每台节点(包括master节点)创建凭证和私钥

创建master1节点的凭证签发请求文件

cat << EOF | tee k8s-master1-csr.json 
{
  "CN": "system:node:${MASTER1_HOSTNAME}",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "system:nodes",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

生成master节点的证书和私钥

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname=${MASTER1_HOSTNAME},${MASTER1_IP} \
  -profile=kubernetes \
 k8s-master1-csr.json | cfssljson -bare k8s-master1

输出信息

2019/10/12 20:08:33 [INFO] generate received request
2019/10/12 20:08:33 [INFO] received CSR
2019/10/12 20:08:33 [INFO] generating key: rsa-2048

2019/10/12 20:08:33 [INFO] encoded CSR
2019/10/12 20:08:33 [INFO] signed certificate with serial number 340503546795644080420594727795505971193705840974

输出的文件

ls k8s-master*.pem

k8s-master1-key.pem  k8s-master1.pem

创建master2节点的凭证签发请求文件

cat << EOF | tee k8s-master2-csr.json
{
  "CN": "system:node:${MASTER2_HOSTNAME}",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "system:nodes",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

生成master2节点的证书和私钥

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname=${MASTER2_HOSTNAME},${MASTER2_IP} \
  -profile=kubernetes \
 k8s-master2-csr.json | cfssljson -bare k8s-master2

输出信息

2019/10/12 20:08:33 [INFO] generate received request
2019/10/12 20:08:33 [INFO] received CSR
2019/10/12 20:08:33 [INFO] generating key: rsa-2048

2019/10/12 20:08:33 [INFO] encoded CSR
2019/10/12 20:08:33 [INFO] signed certificate with serial number 340503546795644080420594727795505971193705840974

输出的文件

ls k8s-master*.pem

k8s-master1-key.pem  k8s-master1.pem k8s-master2-key.pem  k8s-master2.pem

创建master3节点的凭证签发请求文件

cat << EOF | tee k8s-master3-csr.json
{
  "CN": "system:node:${MASTER3_HOSTNAME}",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "system:nodes",
      "OU": "Kubernetes",
      "ST": "Beijing"
    }
  ]
}
EOF

生成k8s-node节点的证书和私钥

cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname=${MASTER3_HOSTNAME},${MASTER3_IP} \
  -profile=kubernetes \
  k8s-master3-csr.json | cfssljson -bare k8s-master3

输出信息

2019/10/12 20:11:22 [INFO] generate received request
2019/10/12 20:11:22 [INFO] received CSR
2019/10/12 20:11:22 [INFO] generating key: rsa-2048
2019/10/12 20:11:22 [INFO] encoded CSR
2019/10/12 20:11:22 [INFO] signed certificate with serial number 329201759031912279536498320815194792351902510021

输出的文件

ls k8s-master3*.pem

k8s-master3-key.pem  k8s-master3.pem

创建k8s-node1节点的凭证签发请求文件

cat << EOF | tee k8s-node1-csr.json
{
  "CN": "system:node:${NODE1_HOSTNAME}",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "China",
      "L": "Beijing",
      "O": "system:nodes",
      "OU": "Kubernetes",
      "S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值