kubeadm部署kubernetes集群

kubeadm部署K8S 1.20 集群

1. Kubernetes概述

1.1 Kubernetes是什么
关于Kubernetes是什么这个问题, 官网上有很详细的说明,地址:https://kubernetes.io/。截止文章发表的这一刻,kubernetes最新版本已经到了v1.21了。

1.2 Kubernetes的特性

  • 自我修复

在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;
杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断;

  • 弹性伸缩

使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;
业务低峰时回收资源,以最小成本运行服务

  • 自动部署和回滚

Kubernetes采用滚动跟新策略更新应用,一次更新一个Pod,而不是同时删除所有的Pod,如果更新过程中出现问题,将回滚更改,确保升级不影响业务。

  • 服务发现和负载均衡

K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

  • 机密和配置管理

管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

  • 存储编排

挂载外部存储系统,无论是来自本地存储,公有云(AWS),还是网络存储(NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性

  • 批处理

提供一次性服务,定时任务;满足批量数据处理和分析的场景

1.3 Kubernetes集群架构组件
1)Master组件

kube-apiserver
(Kubernetes API)集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
kube-schedule
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
2)Node组件 
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
容器引擎,运行容器
1)Pod

最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的
2)Controller

ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod
Job:一次性任务
Cronjob:定时任务
3)更高级层次对象,部署和管理Pod

Service:
防止Pod失联;定义一次Pod的访问策略
Service抽象层不过是iptables或者ipvs中的规则而已
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4)网络解决方案

K8S通过CNI插件体系来接入外部网络服务解决方案
常见的有:
flannel:网络配置相关
calico:网络配置、网络策略
canel:flannel的网络配置 + calico的网络策略
5)三种网络

Pod网络:Pod的地址是配置在Pod内部的网络名称空间上的,是能ping通的,就像正常主机上的地址一样
Service网络(集群网络):Service的地址是虚拟的,它只存在于iptables或者ipvs的规则之中
节点网络:各个节点也应该有一个网络
各个Pod运行在同一个网络中,而service是另外一个网络;Pod和service的地址是不同网段的。

接入外部访问时,先接入节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。

同一Pod内的多个容器之间通过 lo 接口进行通信。

两个Pod之间可以直接进行通信:通过隧道的方式(Overlay叠加网络)来转发二层报文,使得它们虽然扩主机但是好像工作在同一个二层网络中。访问对方Pod所在节点的位置,然后再代理到Pod内部的容器上。
2. 使用kubeadm部署K8S集群
2.1 Kubernetes的三种部署方式
1)minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用。
部署地址:https://kubernetes.io/docs/setup/minikube/
2)kubeadm

Kubeadm是一个工具,提供kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。
部署地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
3)二进制包

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。
下载地址:https://github.com/kubernetes/kubernetes/releases
2.2 K8S集群的部署规划
1)环境需求

系统:CentOS7.4
内存 > 1.7G
CPU > 2核
2)角色规划
3)网络模型

节点网络:172.18.0.0/16
Pod网络:10.244.0.0/16
Service网络:10.96.0.0/12
2.3 环境初始化
在所有节点上都执行
1)关闭防火墙、SELinux
# 关闭防火墙并设置开机禁止启动
systemctl stop firewalld && systemctl disable firewalld

# 关闭SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config  && setenforce 0
2)关闭swap分区

# 临时关闭所有swap
swapoff -a 

# 在/etc/fstab中机制挂载swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3)设置主机名并配置hosts
# 为各个主机配置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

# 配置好主机名后将以下内容写入到所有节点的 /etc/hosts 文件中
172.18.0.67 k8s-master01
172.18.0.68 k8s-node01
172.18.0.69 k8s-node02
4)内核调整

将桥接的 IPv4 的流量传递到 iptables的链
# 设置 net.bridge.bridge-nf-call-ip6tables = 1
# 设置 net.bridge.bridge-nf-call-iptables = 1
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system  # Load  settings  from all system configuration files
5)为各个主机做时间同步

启动chrony服务同步时间即可

6)
在所有的Kubernetes节点执行以下脚本(若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack):
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

如果出现 modprobe: FATAL: Module nf_conntrack_ipv4 not found.报错,是因为使用了高内核,比如5.2的内核。在高版本内核已经把nf_conntrack_ipv4替换为nf_conntrack了。

#安装相关管理工具
yum install ipset ipvsadm -y

2.4 开始安装
在所有节点上执行
1)配置安装源

配置docker-ce的源,合适的yum地址很重要,否则会非常的慢(比如清华的),我这里配置阿里云Docker Yum源
# Set up repository
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# Use Aliyun Docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 注意要修改下载下来的这个repo文件中的地址,将其指向为清华的源的地址
配置Kubernetes的源
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
2)安装docker-ce

yum install -y docker-ce

配置镜像加速器
cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

启动docker
systemctl start docker && systemctl enable docker
docker info

# 安装完成之后注意要为docker配置好镜像加速
3)安装kubeadm、kubelet 和 kubectl

yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
# 注意,要让kubelet开机自启,现在还不能去手动启动它
systemctl enable kubelet
4)为kubelet配置额外参数

# 可以在 /etc/sysconfig/kubelet 这个文件中添加额外的参数
# 如关闭swap功能
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
2.5 部署 K8S Master
只需要在 k8s-master节点上执行
1)初始化master

kubeadm init \
--kubernetes-version v1.20.0 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=172.18.0.67 \
--ignore-preflight-errors=Swap \
--image-repository registry.aliyuncs.com/google_containers 

# apiserver要修改成自己的master节点的地址,默认apiserver监听在所有地址的6443端口上
# 如果swap报错,可以加上选项--ignore-preflight-errors=Swap,但是注意那个Swap的S要大写
# 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
# 注意kubernetes的版本要和之前安装的kubelet的版本一致
2)根据回显提示操作

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3)测试

# 获取组件状态信息
kubectl  get  cs   # cs是kubectl get componentstatus的简写,获取组件状态信息

# 查看k8s集群的节点信息
kubectl get nodes  
4)token失效解决

因为默认 token 的有效期为24小时,过期之后该token就不可用了,所以如果后续有node节点加入,可以重新生成新的token

重新生成新的token
[root@master01 ~]# kubeadm token create
salxe7.gnlwtozqxxsf4uu7
[root@master01 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
he4ugm.z537h1g7taugguco   23h         2021-01-19T15:53:34+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
salxe7.gnlwtozqxxsf4uu7   23h         2021-01-19T15:53:48+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
t4xdcj.5vgr19ymj4g6y7hm   6h          2021-01-18T22:31:08+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
[root@master01 ~]#
获取ca证书sha256编码hash值
[root@master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53
节点加入集群
kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap
2.6 加入K8S Node
在两个Node节点执行
注册Node节点到Master

# kubeadm join 的内容,在上面kubeadm init 已经生成好了
kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap
2.7 安装网络插件flannel
在master节点上安装即可,其他节点加入k8s集群后会自动安装
1)安装flannel

# 这个地址可能访问不到,可以开小飞机手动把这个文件下载下来,然后再apply
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 执行的成功与否要看docker image ls中是否有flannel的镜像,慢慢等待它下载即可
# 要确保能够访问到 quay.io 这个registery
# 如果无法访问,可以将此文件中image项后面的地址修改成可以访问到的地址
2)查看是否安装成功

# 注意,要确保状态为全1/1时,才可进行后续操作
[root@k8s-master01 ~]# kubectl get pods -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-7f89b7bc75-9zxjz               1/1     Running   0          12m
coredns-7f89b7bc75-n8p4s               1/1     Running   0          12m
etcd-k8s-master01                      1/1     Running   0          12m
kube-apiserver-k8s-master01            1/1     Running   0          12m
kube-controller-manager-k8s-master01   1/1     Running   0          12m
kube-flannel-ds-b5ljk                  1/1     Running   0          7m58s
kube-proxy-cwzkw                       1/1     Running   0          12m
kube-scheduler-k8s-master01            1/1     Running   0          12m

# 确保所有节点为Ready状态
[root@k8s-master01 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 93m v1.20.2
k8s-node01 Ready <none> 49m v1.20.2
3)flannel安装失败后重装

如果flannel因为网络问题安装失败,需要进行重新安装
kubectl delete -f kube-flannel.yml

# 然后重新安装
kebectl apply -f kube-flannel.yml
3. Kubernetes集群信息查看及管理
3.1 Pod的创建与查看
1)信息查看

# 查看k8s集群的整体信息
kubectl  cluster-info

# 查看当前系统上已经被创建的控制器
kubectl get deployment

# 查看pod的相关信息
kubectl get pods
kubectl get pods -o wide  # 查看更详细的信息

# 查看services的相关信息
kubectl get services
kubectl get svc

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
2)创建一个pod

# 创建并运行一个特定的镜像,暴露80端口,并且只创建1个副本,干跑模式需要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1

# 如果要镜像中运行其他程序,可以写成这样(注意前面要加 -- )
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
 3)对刚刚创建的pod进行查看并访问

[root@k8s-master01 ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deploy   1/1     Running   0          3m6s   10.244.1.2   k8s-node01   <none>           <none>
[root@k8s-master01 ~]# curl 10.244.1.2
3.2 创建pod并暴露端口
在Kubernetes集群中创建一个pod,然后暴露端口,验证其是否可以正常访问
1)创建deployment

# 创建一个deployment控制器,这个控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx
2)创建service并暴露端口

kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 将nginx-deploy这个控制器(deployment  )相关的pod资源都创建为一个服务,服务名叫nginx
# --name   是service的名称
# --port   是service暴露到外部的端口
# --target-port  是pod暴露的端口
# --protocol     使用的协议,默认就是TCP
# --type         是service的类型,service有多种类型,可kubectl expose --help来查看--type选项,Defaultis 'ClusterIP'
3)查看相关信息并访问

# 查看pod和service的相关信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-8588f9dfb-t8wzr   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   78m
service/nginx        ClusterIP   10.99.193.184   <none>        80/TCP    34s

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system

# 访问:http://NodeIP:PORT,只有在集群内部的节点上才能被访问到
curl http://10.99.193.184
删除节点
设置节点不可调度
#kubectl cordon local-k8s-nd01
驱逐节点上的pod
#kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
删除节点
#kubectl delete node  k8s-node1
在需要删除的节点上执行reset,这样该节点即完全从 Cluster 中脱离开来
#kubeadm reset
常用命令
强制删除  
# kubectl delete pods <pod-name> --grace-period=0 --force
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值