Kubernetes 安装与部署

引言 1. 前置知识点 目前 生产部署 Kubernetes 集群主要有两种方式: kubeadm Kubeadm 是一个K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。 官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/ 二进制包 从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。 Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。 补充: kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。
    minikube:一个用于快速搭建单节点的kubernetes工具。( 适合本地测试, 不适合生产 )
    kubeadm:一个用于快速搭建kubernetes集群的工具。
    二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
2. kubeadm 部署方式介绍 kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署: 创建一个Master 节点kubeadm init 将Node 节点加入到当前集群中$ kubeadm join 3. 安装要求 在开始之前,部署Kubernetes 集群机器需要满足以下几个条件: 一台或多台机器,操作系统CentOS7.x-86_x64 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多 集群中所有机器之间网络互通 可以访问外网,需要拉取镜像 禁止swap 分区 本人使用 阿里云ECS (香港), (香港地区采用国际线路, 可以不配置国内加速, 直接就可以访问 Google 资源)
角色 IP地址 操作系统 配置
master 192.168.18.100 CentOS 7.8 2核CPU,2G内存,50G硬盘
node1 192.168.18.101 CentOS 7.8 2核CPU,2G内存,50G硬盘
node2 192.168.18.102 CentOS 7.8 2核CPU,2G内存,50G硬盘
4. 最终目标 在所有节点上安装Docker 和kubeadm 部署Kubernetes Master 部署容器网络插件 部署Kubernetes Node,将节点加入Kubernetes 集群中 部署Dashboard Web 页面,可视化查看Kubernetes 资源 5. 准备环境
角色 IP地址 组件
master 192.168.5.3 docker,kubectl,kubeadm,kubelet
node1 192.168.5.4 docker,kubectl,kubeadm,kubelet
node2 192.168.5.5 docker,kubectl,kubeadm,kubelet
6. 环境初始化

6.1 检查操作系统的版本

此方式下安装kubernetes集群要求 CentOS 版本要在7.5或之上
1
2
[root@master ~]cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)

6.2 关闭防火墙和禁止防火墙开机启动

关闭防火墙:
1
systemctl stop firewalld
禁止防火墙开机启动:
1
systemctl disable firewalld

6.3 设置主机名

设置主机名:
1
hostnamectl set-hostname <hostname>
设置 master 的主机名:
1
hostnamectl set-hostname k8s-master
设置 node1 的主机名:
1
hostnamectl set-hostname k8s-node1
设置 node2 的主机名:
1
hostnamectl set-hostname k8s-node2

6.4 主机名解析

为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器 主机名称解析 编辑三台服务器的/etc/hosts文件
1
2
3
4
5
cat >> /etc/hosts << EOF
192.168.18.100 k8s-master
192.168.18.101 k8s-node1
192.168.18.102 k8s-node2
EOF

6.5 时间同步

kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:
1
yum install ntpdate -y
1
ntpdate time.windows.com
方法2 这里使用chronyd服务从网络同步时间
1
2
3
4
# 启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
企业中建议配置内部的时间同步服务器

6.6 关闭 selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题 查看selinux是否开启:
1
getenforce
永久关闭selinux,需要重启:
1
sed -i 's/enforcing/disabled/' /etc/selinux/config
永久关闭 方法2
1
2
3
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
临时关闭selinux,重启之后,无效:
1
setenforce 0

6.7 关闭 swap 分区

永久关闭swap分区,需要重启:
1
sed -ri 's/.*swap.*/#&/' /etc/fstab
临时关闭swap分区,重启之后,无效:
1
swapoff -a

6.8 将桥接的IPv4流量传递到iptables的链

在每个节点上将桥接的IPv4流量传递到iptables的链:
1
2
3
4
5
6
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
1
2
# 加载br_netfilter模块
modprobe br_netfilter
1
2
# 查看是否加载
lsmod | grep br_netfilter
1
2
# 生效
sysctl --system

6.9开启ipvs

在kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块。 在每个节点安装ipset和ipvsadm:
1
yum -y install ipset ipvsadm
在所有节点执行如下脚本:
1
2
3
4
5
6
7
8
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
授权、运行、检查是否加载:
1
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
检查是否加载:
1
lsmod | grep -e ipvs -e nf_conntrack_ipv4

6.10 重启三台机器

重启三台Linux机器:
1
reboot
7. 每个节点安装 Docker、kubeadm、kubelet 、kubectl

7.1 安装 Docker

安装Docker:
1
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装
1
yum -y install docker-ce-18.06.3.ce-3.el7
开启启动, 启动 docker 服务
1
systemctl enable docker && systemctl start docker
1
docker version
设置 Docker 镜像加速器:
1
sudo mkdir -p /etc/docker
1
2
3
4
5
6
7
8
9
10
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"storage-driver": "overlay2"
}
EOF
1
sudo systemctl daemon-reload
1
sudo systemctl restart docker

7.2 添加阿里云的 yum 软件源

由于kubernetes的镜像源在国外,非常慢,这里切换成国内的阿里云镜像源:
1
2
3
4
5
6
7
8
9
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

7.3 安装 kubeadm、kubelet、kubectl

由于版本更新频繁,这里指定版本号部署:
1
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:
1
vim /etc/sysconfig/kubelet
1
2
3
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
设置为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动:
1
systemctl enable kubelet

7.4 查看 k8s 所需镜像

查看k8s所需镜像:
1
kubeadm config images list

7.5 部署k8s的 master 节点

部署 k8s 的 master节点 (192.168.18.100) :
1
2
3
4
5
6
7
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址
kubeadm init \
--apiserver-advertise-address=192.168.18.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
根据提示消息,在 master 节点上使用 kubectl 工具:
1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

7.6 部署 k8s 的 node节点

根据提示,在192.168.18.101和192.168.18.102上添加如下的命令:
1
2
kubeadm join 192.168.18.100:6443 --token jv039y.bh8yetcpo6zeqfyj \
--discovery-token-ca-cert-hash sha256:3c81e535fd4f8ff1752617d7a2d56c3b23779cf9545e530828c0ff6b507e0e26
默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token:
1
kubeadm token create --print-join-command
1
2
# 生成一个永不过期的token
kubeadm token create --ttl 0 --print-join-command

7.7 部署 CNI 网络插件

根据提示,在 master 节点上使用 kubectl 工具查看节点状态:
1
kubectl get nodes
kubernetes 支持多种网络插件,比如 flannel、calico、canal 等,任选一种即可,本次选择 flannel 在 master 节点上获取 flannel 配置文件(可能会失败,如果失败,请下载到本地,然后安装):
1
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
使用配置文件启动flannel:
1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看部署 CNI 网络插件进度:
1
kubectl get pods -n kube-system
再次在 master 节点使用 kubectl 工具查看节点状态:
1
kubectl get nodes
查看集群健康状况:
1
kubectl get cs
1
kubectl cluster-info
8. 服务部署

8.1 前言

在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。 Q&A 补充 参考 感谢帮助! Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级)_哔哩哔哩_bilibili Kubernetes 文档 | Kubernetes k8s详细教程/Kubernetes详细教程.md · yooome/LearningNotes - 码云 - 开源中国 k8s(v1.18.0) · 语雀 安装 kubeadm | Kubernetes centos7使用kubeadm安装kubernetes集群 | 运维随笔