一、用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 etcd coredns calico |
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.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 <
上面脚本创建了/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 < /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节点时会用到) 上图所示
初始化过程说明:
- [preflight] kubeadm 执行初始化前的检查。
- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates] 生成相关的各种token和证书
- [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
- [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
- [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
- [addons] 安装附加组件 kube-proxy 和 kube-dns。
- Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。
- 提示如何安装 Pod 网络。
- 提示如何注册其他节点到 Cluster。
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+
NAMESTATUS MESSAGE ERROR
controller-manager Healthy ok
schedulerHealthy ok
etcd-0Healthy {"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集群就创建完成了。
【kubernetes学习|用kubeadm搭建kubernetes集群】
推荐阅读
- 运维|Kubernetes集群上部署zookeeper和dubbo
- k8s|【kubernetes篇】教你kubeadm方式搭建kubernetes 集群。单master节点集群,多master节点集群说明。
- linux|zabbix server 6.0安装(rancher+kubernetes部署)
- 云栖号技术分享|阿里云云效技术专家(一文详解kubernetes下5种常见发布模式如何选择)
- kubernetes|docker-compose yaml编写
- kubernetes集群|kubernetes集群常用POD调度策略
- kubernetes|系列(5、Kubernetes中的调度)
- 微服务|【云原生&微服务十】SpringCloud之OpenFeign实现服务间请求头数据传递(OpenFeign拦截器RequestInterceptor的使用)
- Flutter|Flutter Column等容器嵌套ListView报错,由于高度没办法确定