二、kubernetes集群搭建(kubeadm方式)
1、前置知识点
目前生产部署Kubernetes集群主要有两种方式:
- 1 kubeadm
Kubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。
- 2 二进制包
从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
2、kubeadm部署方式介绍
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署:
第一、创建一个Master节点kubeadminit
第二,将Node节点加入到当前集群中$kubeadmjoin<Master节点的IP和端口>
3、安装要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
一台或多台机器,操作系统CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止swap分区
4、最终目标
(1)在所有节点上安装Docker和kubeadm
(2)部署KubernetesMaster
(3)部署容器网络插件
(4)部署KubernetesNode,将节点加入Kubernetes集群中
(5)部署DashboardWeb页面,可视化查看Kubernetes资源
5、准备环境
主机名 | IP地址 |
---|---|
master | 37.10 |
node1 | 37.11 |
node2 | 37.12 |
6、系统初始化
6.1 关闭防火墙、禁止开机启动防火墙
systemctl stop firewalld
systemctl disable firewalld
6.2 关闭selinux
#永久
sed -i 's/enforcing/disabled/' /etc/selinux/config
#临时
setenforce 0
6.3 关闭swap
#临时
swapoff -a
#永久
sed -ri 's/.*swap.*/#&/' /etc/fstab
6.4 主机名
hostnamectl set-hostname <hostname>
6.5 添加hosts
cat >> /etc/hosts <<EOF
192.168.37.10 master
192.168.37.11 node1
192.168.37.12 node2
EOF
6.6 将桥接的IPv4流量传递到iptables的链、地址转发
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
#生效
sysctl --system
#加载网桥过滤模块
modprobe br_netfilter
#查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
6.7 时间同步
yum install ntpdate -y
ntpdate time.windows.com
# 设置时区
timedatectl set-timezone Asia/Shanghai
6.8 配置ipvs功能
在kubernetes中service有两种代理模型,一种基于iptables的,一种基于ipvs的,两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
#1 安装ipset和ipvsadm
yum install ipset ipvsadm -y
#2 添加需要加载的模块写入脚本文件
cat << EOF > /etc/sysconfigmodules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#3 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
#4 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
#5 查看对应的模块是否加载成功
lsmod |grep -e ip_vs -e nf_conntrack_ipv4
7、 所有节点安装(Docker/kubeadm/kubelet)
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
7.1 需要epel源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum install epel-release -y
7.2 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce-18.06.1.ce-3.el7 -y
systemctl enable docker && systemctl start docker
docker --version
7.3 Docker镜像仓库改成阿里的
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors":["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
7.4 添加yum源
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
#重启服务
systemctl restart docker
8、安装kubeadmin,kubelet 和 kubectl
#如果报错、用'yum clean all'清除YUM缓存、再试!!!
yum install kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 -y
#设置kubectl开机起动
systemctl enable kubelet
9、 部署Kubernetes Master
在 (Master)
执行
kubeadm init \
--apiserver-advertise-address=192.168.37.10 \
--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
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
使用kubectl工具
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 36s v1.18.0
10、 加入Kubernetes Node
在37.11/12(Node)
执行
向集群添加新节点,执行kubeadm init输出的kubeadm join命令
kubeadm join 192.168.37.10:6443 --token rs6ic6.l8ep2taybz0o7gkv \
--discovery-token-ca-cert-hash sha256:5369ce646d6302aacc3d876e2efd1e151b5798b4c31c40b1e1d9255f9a4f8583
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command
在 (Master)
查看、节点添加成功
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 56s v1.18.0
node1 NotReady <none> 17s v1.18.0
node2 NotReady <none> 17s v1.18.0
11、 部署CNI网络插件(参考)
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
此处下载不成功需要科学上网(VPN、可点击上面参考
)
kubectl apple -f kube-flannel.yml
此步可忽略!!!
如果此处一直'Pending'、执行'sed -i 's/--network-plugin=cni//' /var/lib/kubelet/kubeadm-flags.env'
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-b7l7k 1/1 Running 0 130m
coredns-7ff77c879f-mmvc7 1/1 Running 0 130m
etcd-master 1/1 Running 0 130m
kube-apiserver-master 1/1 Running 0 130m
kube-controller-manager-master 1/1 Running 0 130m
kube-flannel-ds-amd64-5plgj 1/1 Running 0 43m
kube-flannel-ds-amd64-f7b5z 1/1 Running 0 43m
kube-flannel-ds-amd64-zvbgd 1/1 Running 0 43m
kube-proxy-lbswc 1/1 Running 0 122m
kube-proxy-skkrc 1/1 Running 0 122m
kube-proxy-x4f2b 1/1 Running 0 130m
kube-scheduler-master 1/1 Running 0 130m
12、测试 kubernetes 集群
在 Kubernetes 集群中创建一个 pod,验证是否正常运行
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
访问地址:http://NodeIP:Port