赞
踩
一、用kubeadm部署kubernetes
kubernetes节点架构图:
kubernetes组件架构图:
1.准备基础环境
我们将使用kubeadm部署3个节点的 Kubernetes Cluster,节点信息如下:
主机名 | IP地址 | 角色 | OS | 组件 | 最低配置 |
master | 192.168.139.13 | master | centos7 | kube-apiserver kube-controller-manager kube-scheduler kube-proxy coredns | 2C2G |
node1 | 192.168.139.14 | node1 | centos7 | kube-proxy calico | 2C2G |
node2 | 192.168.139.15 | node2 | centos7 | kube-proxy calico | 2C2G |
node3 | 192.168.139.16 | node3 | centos7 | calico kube-proxy | 2C2G |
2.系统初始化的准备工作(无特殊说明以下操作须在所有节点执行)
2.1修改主机名
- #master节点:
- hostnamectl set-hostname master
- #node1节点:
- hostnamectl set-hostname node1
- #node2节点:
- hostnamectl set-hostname node2
- #node3节点:
- hostnamectl set-hostname node3
注:为了方便可以使用ansible去查看
2.2基础配置
- #修改/etc/hosts文件
- cat >> /etc/hosts << EOF
- 192.168.139.13 master
- 192.168.139.14 node1
- 192.168.139.15 node2
- 192.168.139.16 node3
- EOF
- #关闭防火墙和selinux
- systemctl stop firewalld && systemctl disable firewalld
- sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0
- #临时关闭swap
- swapoff -a
- #永久关闭swap
- sed -ri 's/.*swap.*/#&/' /etc/fstab
2.3配置时间同步
- #安装chrony:
- yum install -y chrony
- #注释默认ntp服务器
- sed -i 's/^server/#&/' /etc/chrony.conf
- #指定上游公共 ntp 服务器,并允许其他节点同步时间
- cat >> /etc/chrony.conf << EOF
- server 0.asia.pool.ntp.org iburst
- server 1.asia.pool.ntp.org iburst
- server 2.asia.pool.ntp.org iburst
- server 3.asia.pool.ntp.org iburst
- allow all
- EOF
- #重启chronyd服务并设为开机启动:
- systemctl enable chronyd && systemctl restart chronyd
- #开启网络时间同步功能
- timedatectl set-ntp true
2.3.1 node节点配置时间同步
- #安装chrony:
- yum install -y chrony
- #注释默认服务器
- sed -i 's/^server/#&/' /etc/chrony.conf
- #指定内网 master节点为上游NTP服务器
- echo server 192.168.139.13 iburst >> /etc/chrony.conf
- #重启服务并设为开机启动:
- systemctl enable chronyd && systemctl restart chronyd
所有节点执行chronyc sources命令,查看存在以^*开头的行,说明已经与服务器时间同步
2.4 将桥接的IPv4流量传递到iptables的链
由于iptables被绕过会导致流量路由不正确,所以需要在各个节点配置如下:
- 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
- #加载br_netfilter模块
- modprobe br_netfilter
- #查看是否加载
- lsmod | grep br_netfilter
- #生效
- sysctl --system
2.5加载ipvs相关模块
为了便于查看ipvs的代理规则,在所有节点安装ipvs和ipset安装包
yum install -y ipvs ipset
由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
在所有的Kubernetes节点执行以下脚本:
- 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
上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
三、安装k8s服务安装包
Kubernetes默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。所以在所有节点需要先安装docker
- #配置docker yum源
- yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果出现以下报错,需要安装yum-utils这个安装包:
yum -y install yum-utils
1.安装docker服务和启动docker服务并将其设置为开机启动
yum install -y docker &&systemctl start docker &&docker enable docker
2.配置docker加速并修改驱动
kubernetes官方建议docker驱动采用systemd,当然可以不修改,只是kubeadm init时会有warning([WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/)可以忽略,生产环境建议修改,因为更稳定。
通过docker info 可以查看到安装的docker默认驱动是cgroupfs
在所有节点添加配置加速如下并将驱动修改:
- {
- "exec-opts":["native.cgroupdriver=systemd"],
- "registry-mirrors":["https://bsa5lza7.mirror.aliyuncs.com"]
- }
- systemctl daemon-reload
- systemctl restart docker
- docker info |grep "Cgroup Driver"
注:上图中不清楚咋样配置docker加速器可以访问Docker 镜像加速 | 菜鸟教程
3.安装kuberenetes组件
3.1配置kubernetes的yum源
1>kubelet 在集群中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
2>kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
3>kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。
- #配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源
- cat <<EOF > /etc/yum.repos.d/kubernetes.repo
- [kubernetes]
- name=Kubernetes
- baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
- enabled=1
- gpgcheck=1
- repo_gpgcheck=1
- gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- EOF
3.2在所有节点上安装指定版本 kubelet、kubeadm 和 kubectl
yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0
3.3启动kubelet服务
- [root@master yum.repos.d]# systemctl enable kubelet && systemctl start kubelet
- Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
- [root@master yum.repos.d]# kubelet --version
- Kubernetes v1.21.0
此时kubelet处于不断重启状态,因为集群还没有初始化,kubelet等待kubeadm初始化完成后运行状态正常。
4.部署K8s的master
4.1查看初始化需要的镜像
- [root@master yum.repos.d]# kubeadm config images list
- I1217 18:41:32.037319 51446 version.go:254] remote version is much newer: v1.23.1; falling back to: stable-1.21
- k8s.gcr.io/kube-apiserver:v1.21.8
- k8s.gcr.io/kube-controller-manager:v1.21.8
- k8s.gcr.io/kube-scheduler:v1.21.8
- k8s.gcr.io/kube-proxy:v1.21.8
- k8s.gcr.io/pause:3.4.1
- k8s.gcr.io/etcd:3.4.13-0
- k8s.gcr.io/coredns/coredns:v1.8.0
4.2kubeadm init介绍
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address apiserver的监听地址,有多块网卡时需要指定
(指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。)
--apiserver-bind-port apiserver的监听端口,默认是6443
--cert-dir 通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint 控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository 拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version 指定kubernetes版本
(关闭版本探测,因为它的默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(最新版:v1.21.0)来跳过网络请求。)
--pod-network-cidr pod资源的网段,需与pod网络插件的值设置一致
(指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求)
--service-cidr service资源的网段
--service-dns-domain service全域名的后缀,默认是cluster.local
4.3kubeadm指定具体参数初始化
因为以上镜像都需要从kubernetes官方镜像仓库拉取,国内无法访问,所以需要设置国内的阿里镜像仓库,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。
4.4部署k8s的Master节点
- kubeadm init \
- --apiserver-advertise-address=192.168.139.13 \
- --image-repository registry.aliyuncs.com/google_containers \
- --service-cidr=10.96.0.0/12 \
- --pod-network-cidr=10.244.0.0/16
初始化成功后会出现如下信息
(注意记录下初始化结果中的kubeadm join命令,部署worker节点时会用到) 上图所示
初始化过程说明:
4.5根据提示信息,在Master节点上使用kubectl工具
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
注:需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。
如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。
查看集群组件状态是否正常:
- [root@master yum.repos.d]# kubectl get cs
- Warning: v1 ComponentStatus is deprecated in v1.19+
- NAME STATUS MESSAGE ERROR
- controller-manager Healthy ok
- scheduler Healthy ok
- etcd-0 Healthy {"health":"true"}
5.添加node节点
5.1在node1,node2,node3上添加如下命令:
- kubeadm join 192.168.139.13:6443 --token irfynt.htcy2ymyoexwkgqx \
- --discovery-token-ca-cert-hash sha256:865e5dadb2341823edb7677790d7504d1e8f73e6fe86e3c730429fd4c8d7eef9
执行成功后如下图所示代表节点已加入集群中
- [root@node3 yum.repos.d]# kubeadm join 192.168.139.13:6443 --token irfynt.htcy2ymyoexwkgqx --discovery-token-ca-cert-hash
- sha256:865e5dadb2341823edb7677790d7504d1e8f73e6fe86e3c730429fd4c8d7eef9
- [preflight] Running pre-flight checks [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
- [preflight] Reading configuration from the cluster...
- [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
- [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
- [kubelet-start] Starting the kubelet
- [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
-
- This node has joined the cluster:
- * Certificate signing request was sent to apiserver and a response was received.
- * The Kubelet was informed of the new secure connection details.
-
- Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
5.2默认的token有效期为24小时,当过期之后,该token就不能用了,这时可以使用如下的命令创建token。在master执行此命令
kubeadm token create --print-join-command
如果要生成一个永不过期的token,执行以下命令
kubeadm token create --ttl 0
5.3部署CNI网路插件
在master节点上执行 kubectl get nodes查看节点状态
将网络组件下载到本地并安装
- [root@master ~]# wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml
- [root@master ~]# kubectl apply -f calico.yaml
查看部署CNI网络插件进度:
然后再去查看节点状态:
查看集群信息:
查看所有pod,节点,组件都显示正常状态,kubernetes集群就创建完成了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。