Kubernetes(k8s)入门到实战教程(kubeadm方式)

356 阅读2分钟

二、kubernetes集群搭建(kubeadm方式)

1、前置知识点

目前生产部署Kubernetes集群主要有两种方式:

  • 1 kubeadm

Kubeadm是一个K8s部署工具,提供kubeadminit和kubeadmjoin,用于快速部署Kubernetes集群。

官方地址:kubernetes.io/docs/refere…

  • 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、准备环境

图片.png

主机名IP地址
master37.10
node137.11
node237.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

图片.png

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