一、K8S简介
Kubernetes中文官网:Kubernetes
GitHub:github.com/kubernetes/kubernetes
Kubernetes简称为K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,起源于Google 集群管理工具Borg。
Kubernetes集群组件逻辑图
k8s集群属于Master-Slave主从架构,Master节点负责集群管理和资源调度,用于运行控制平面组件(Control Plane Components),Slave节点就是工作负载节点,一般称为Node节点,也叫Worker节点,主要负责运行Pod,一个Pod里可以同时运行多个容器,而容器一般封装的就是基于Dokcer打包的应用,Pod英文叫豌豆荚,每个容器就像是一颗豌豆,简单来说Pod就是一组容器。
安装部署
二进制包
Github下载稳定版的二进制包,手动部署每个组件组成k8s集群。
kubeadm工具
使用Kubeadm工具可以快速搭建一个k8s集群,主要包括初始化控制平面节点和加入Worker节点,提供的主要功能如下:
kubeadm init:初始化一个Master节点
kubeadm join:将Worker节点加入集群
kubeadm upgrade:升级K8s版本
kubeadm token:管理 kubeadm join 使用的令牌
kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改
kubeadm version:打印 kubeadm 版本
kubeadm alpha:预览可用的新功能
二、准备工作
软硬件要求
- Linux操作系统,Ubuntu 或 CentOS
- 每台节点至少2G
- Master节点至少2C
- 集群节点网络互通
环境配置
修改hosts配置
配置所有节点的IP和域名映射
# vim /etc/hosts
172.25.254.100 k8s_master
172.25.254.10 k8s_node1
172.25.254.20 k8s_node2
关闭Swap分区
kubelet要求必须禁用交换分区,所以kubeadm初始化时回检测swap是否关闭,如果没有关闭会报错,如果不想关闭安装时kubelet命令需要添加--fail-swap-on=false,关闭Swap分区必须在所有节点上执行如下命令:
# 临时关闭,重启恢复
[root@k8s_node1 ~]# swapoff -a
# 永久关闭,注释swap行
[root@k8s_node1 ~]# cat /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
禁用SELinux
所有节点执行如下命令:
[root@k8s_node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
关闭防火墙
所有节点执行如下命令:
[root@k8s_node1 ~]# systemctl disable firewalld
[root@k8s_node1 ~]# systemctl stop firewalld
配置k8s的Yum源
[root@k8s_node1 ~]# 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=0
三、下载并安装docker
[root@k8smaster yum.repos.d]# dnf install docker-ce -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份
本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。
上次元数据过期检查:0:02:44 前,执行于 2024年10月06日 星期日 16时57分04秒。
依赖关系解决。
========================================================================
软件包 架构 版本 仓库 大小
========================================================================
安装:
docker-ce x86_64 3:27.3.1-1.el9 docker-ce 27 M
安装依赖关系:
containerd.io x86_64 1.7.22-3.1.el9 docker-ce 43 M
docker-ce-cli x86_64 1:27.3.1-1.el9 docker-ce 7.9 M
安装弱的依赖:
docker-buildx-plugin x86_64 0.17.1-1.el9 docker-ce 14 M
docker-ce-rootless-extras x86_64 27.3.1-1.el9 docker-ce 4.4 M
docker-compose-plugin x86_64 2.29.7-1.el9 docker-ce 13 M
事务概要
========================================================================
安装 6 软件包
配置认证
[root@k8s_master ~]# mkdir -p /etc/docker/certs.d/reg.mqw.org/
[root@hub harbor]# scp /data/certs/mqw.org.crt root@172.25.254.100:/etc/docker/certs.d/reg.mqw.org/ca.crt
root@172.25.254.100's password:
mqw.org.crt 100% 2114 1.5MB/s 00:00
指定docker默认的仓库
[root@k8s_master ~]# cd /etc/docker/
[root@k8s_master docker]# vim daemon.json
{ "registry-mirrors": ["https://reg.mqw.org"] }[root@k8s_master docker]# systemctl enable --now docker
添加配置模块
#开机时能自动激活
[root@k8s_master ~]# echo br_netfilter > /etc/modules-load.d/docker_mod.conf[root@k8s_master ~]# modprobe br_netfilter
[root@k8s_master ~]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
[root@k8s_master ~]# sysctl --system[root@k8s_master ~]# systemctl restart docker
四、配置k8s
配置软件仓库
#都配置
[root@k8s-master ~]# cd /etc/yum.repos.d/
[root@k8s-master yum.repos.d]# vim k8s.repo
安装三大组件-kubeadm、kubelet、kubectl
- kubeadm:用来初始化k8s集群的指令。
- kubelet:在集群的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源
# 所有节点都安装
[root@k8s-node1 ~]# yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 所有节点设置开机启动
[root@k8s-node1 ~]# systemctl enable kubelet
[root@k8s-master ~]# dnf install *.rpm -y
[root@k8s-master ~]# vim /lib/systemd/system/cri-docker.service
启动
[root@k8s-master ~]# systemctl enable --now cri-docker.service
[root@k8s-master ~]# systemctl enable --now kubelet.service
在master节点拉取k8s镜像
root@k8s-master ~]# kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.30.0 \
--cri-socket=unix:///var/run/cri-dockerd.sock
上传镜像到harbor仓库
[root@k8s-master ~]# docker images | awk '/google/{ print $1":"$2}' \
| awk -F "/" '{system("docker tag "$0" reg.timinglee.org/k8s/"$3)}'
[root@k8s-master ~]# docker images | awk '/k8s/{system("docker push "$1":"$2)}'
上传到hub仓库
打上标签上传
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.0 reg.mqw.org/k8s/kube-apiserver:v1.30.0
[root@k8s-master ~]# docker push reg.mqw.org/k8s/kube-apiserver:v1.30.0
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.0 reg.mqw.org/k8s/kube-controller-manager:v1.30.0
[root@k8s-master ~]# docker push reg.mqw.org/k8s/kube-controller-manager:v1.30.0
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.0 reg.mqw.org/k8s/kube-scheduler:v1.30.0
[root@k8s-master ~]# docker push reg.mqw.org/k8s/kube-scheduler:v1.30.0
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.30.0 reg.mqw.org/k8s/kube-proxy:v1.30.0
[root@k8s-master ~]# docker push reg.mqw.org/k8s/kube-proxy:v1.30.0
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/coredns:v1.11.3 reg.mqw.org/k8s/coredns:v1.11.3
[root@k8s-master ~]# docker push reg.mqw.org/k8s/coredns:v1.11.3
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/pause:3.9 reg.mqw.org/k8s/pause:3.9
[root@k8s-master ~]# docker push reg.mqw.org/k8s/pause:3.9
[root@k8s-master ~]# docker tag registry.aliyuncs.com/google_containers/etcd:3.5.15-0 reg.mqw.org/k8s/etcd:3.5.15-0
[root@k8s-master ~]# docker push reg.mqw.org/k8s/etcd:3.5.15-0
集群
初始化
[root@k8smaster ~]# kubeadm init --pod-network-cidr=10.244.0.0/16 \
> --image-repository reg.mqw.org/k8s \
> --kubernetes-version v1.30.0 \
> --cri-socket=unix:///var/run/cri-dockerd.sock
#指定集群配置文件变量
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
#设置kubectl命令补齐功能
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc
安装网络插件
[root@k8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@k8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5
[root@k8s-master ~]# docekr docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
[root@k8s-master ~]# docker tag flannel/flannel:v0.25.5 \
reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 \
reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel:v0.25.5
[root@k8s-master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
#编辑kube-flannel.yml 修改镜像下载位置
[root@k8s-master ~]# vim kube-flannel.yml
146: image: reg.timinglee.org/flannel/flannel:v0.25.5
173: image: reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1
184: image: reg.timinglee.org/flannel/flannel:v0.25.5
#安装flannel网络插件
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
启用服务
[root@k8s-node1 ~]# systemctl start kubelet.serv
#复制令牌
[root@k8s-node1 ~]# kubeadm join 172.25.254.100:6443 --token n3u7gu.zzumlnbhevtohv9f --discovery-token-ca-cert-hash sha256:0c08e6ff75578e3b1778cf72c7e81c91397c4ec6de21ac5abde16c71a6df34d3 --cri-socket=unix:///var/run/cri-dockerd.sock
五、K8s命令
基础命令
1.显示集群版本
[root@k8s-master ~]# kubectl version
2.显示集群信息
[root@k8s-master ~]# kubectl cluster-info
3.给镜像打标签
[root@k8s-master ~]# docker tag busybox:latest reg.timinglee.org/mnwl/busybox:latest
4.上传本地镜像到镜像仓库
[root@k8s-master ~]# docker push reg.timinglee.org/mnwl/busybox:latest
5.创建一个名为webcluster的控制器,pod数量为2
[root@k8s-master ~]# kubectl create deployment webcluster --image reg.timinglee.org/mnwl/nginx:laest --replicas 2
6.查看控制器
[root@k8s-master ~]# kubectl get deployments.apps
7.查看资源帮助
[root@k8s-master ~]# kubectl explain deployment
8.查看控制器参数帮助
[root@k8s-master ~]# kubectl explain deployment.spec
9.编辑控制器
[root@k8s-master ~]# kubectl edit deployment.apps webcluster
10.利用补丁更改控制器数量
[root@k8s-master ~]# kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":3}}'
11.删除控制器资源
[root@k8s-master ~]# kubectl delete deployments.apps webcluster
运行和调试命令
1.运行pod
[root@k8s-master ~]# kubectl run testpod --image reg.timinglee.org/mnwl/nginx:latest
[root@k8s-master ~]# kubectl get pods
2.端口暴露
[root@k8s-master ~]# kubectl get services
[root@k8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80
3.查看资源详细信息
[root@k8s-master ~]# kubectl describe pods testpod
4.快速删除资源信息
[root@k8s-master ~]# kubectl delete pods/testpod --force
5.查看资源日志
[root@k8s-master ~]# kubectl logs pods/testpod
6.进行交互pod
[root@k8s-master ~]# kubectl run -it testpod --image reg.timinglee.org/mnwl/busybox
[root@k8s-master ~]# kubectl attach pods/testpod -it
[root@k8s-master ~]# kubectl exec -it pods/testpod /bin/sh
7.本机和pod的文件交换
[root@k8s-master ~]# kubectl cp anaconda-ks.cfg testpod:/
高级命令
1.利用命令生成yaml文件
[root@k8s-master ~]# kubectl create deployment --image reg.timinglee.org/mnwl/nginx webc luster --dry-run=client -o yaml > webcluster.yml
2.利用yaml文件生成资源
[root@k8s-master ~]# kubectl apply -f webcluster.yml
3.管理资源标签
[root@k8s-master ~]# kubectl run nginx --image reg.timinglee.org/mnwl/nginx:latest
[root@k8s-master ~]# kubectl get pods --show-labels
4.添加标签
[root@k8s-master ~]# kubectl label pods nginx app=mnwl
5.更改标签
[root@k8s-master ~]# kubectl label pods nginx app=cluster --overwrite
6.删除标签
[root@k8s-master ~]# kubectl label pods nginx app-
7.用控制器管理的pod,删除pod,会自动创建pod,除非删除控制器
[root@k8s-master network-scripts]# kubectl get pod
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 4h48m
webcluster-7697fbcd88-jmmcp 1/1 Running 0 3h49m
[root@k8s-master ~]# kubectl delete pod webcluster-7697fbcd88-jmmcp
pod "webcluster-7697fbcd88-jmmcp" deleted
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 4h50m
webcluster-7697fbcd88-9bk8t 1/1 Running 0 4s