当前位置: 首页 > news >正文

k8s基础(未完待续)

1. 什么是k8s?

        一个开源的​​容器编排平台​​,用于自动化部署、扩展和管理容器化应用程序。

2. k8s核心功能

        •​​自动化部署与伸缩​​:自动部署容器化应用,并根据负载动态调整副本数量。
•​​自我修复​​:当容器或节点故障时,自动重启或替换容器,确保应用高可用。
•​​服务发现与负载均衡​​:通过 Service 提供稳定的访问入口,并在多个 Pod 间分配流量。
•​​滚动更新与回滚​​:支持无缝更新应用,并在出现问题时快速回滚。
•​​存储编排​​:自动挂载存储系统(如本地磁盘、云存储),并提供持久化存储管理。
•​​配置与密钥管理​​:通过 ConfigMap 和 Secret 管理应用配置和敏感数据。

3. k8s架构与核心组件

        K8s 集群采用​​主从架构​​,分为控制平面(Control Plane)和节点(Node)。

控制平面(Master 节点)

        负责集群的管理和调度:

        •​​kube-apiserver​​:集群的入口,处理所有 RESTful API 请求。

        •​​etcd​​:分布式键值存储,保存集群的所有状态数据。

        •​​kube-scheduler​​:负责将 Pod 调度到合适的 Node 上运行。

        •​​kube-controller-manager​​:运行控制器(如 Node Controller、ReplicaSet Controller),确保集群状态符合预期。

        •​​cloud-controller-manager​​(可选):用于与云服务商集成,管理云资源(如负载均衡器)。

工作节点(Node)

运行容器化应用:

        •​​kubelet​​:负责管理节点上的 Pod 和容器,与控制平面通信。

        •​​kube-proxy​​:实现 Service 的网络代理和负载均衡。

        •​​容器运行时​​(如 containerd、CRI-O):负责运行容器。

4. 实战操作

4.1 配置linux主机操作

        设置master、worker1和worker2三个机器,为了区分三个主机,分别设置三个主机名

hostnamectl set-homename master
hostnamectl set-homename worker1
hostnamectl set-homename worker2

        之后需要设置IP地址段,根据自己的实际情况去配置,具体需要配置的是IPADDR、NETMASK、GATEWAY和DNS1。可以使用以下命令查看。

cat /etc/sysconfig/network-scripts/ifcfg-ens33

        配置完成之后需要重新启动。

systemctl restart network

        接着,配置主机操作文件,添加主机,使其可以相互连通。

vim /etc/hosts

        然后需要关闭防火墙和配置selinux。

systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld #开机禁用
firewall-cmd --statecat /etc/selinux/config
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot

        然后,设置主机的同步时间

yum -y install ntpdatentpdate time1.aliyun.com #立即同步crontab -e
#crontab内容,定时进行时间同步
0 */1 * * * ntpdate time1.aliyun.com

        如果使用kubeadm部署方式,则必须要关闭swap分区

vim /etc/fstab
free -m
reboot

        接着,添加网桥过滤

vim /etc/sysctl.d/k8s.conf
#添加内容
net.bridge.bridge-nf-ca11-ip6tables=1
net.bridge.bridge-nf-ca11-iptables=1
net.ipv4.ip_forward =1
vm.swappiness= 0#接着加载br_netfilter模块
modprobe br_netfilter
#查看是否加载
lsmod | grep br_netfilter#加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/k8s.conf

        接着,安装并开启ipvs

yum -y install ipset ipvsadm#添加需要加载的模块
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 750 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

        接着,需要安装docker-ce

#获取docker
wget -O /etc/yun.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo#查看docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r#安装docker
yum -y install --setopt=obsoletes=0 docker版本#要修改docker配置文件
cat /usr/lib/systemd/system/docker.service
#如果在[Service]中的ExecStart中有 -H ,则删除-H后面的内容#在docker的daemon文件中添加内容
cat /etc/docker.daemon.json
vim /etc/docker.daemon.json
#内容
{"exec-opts": ["native.cgroupdriver=systemd"]
}

4.2 安装k8s

vim /etc/yum.repos.d/k8s.repo
#添加以下配置信息
[kubernetes]
name=Kubernetes
baseur1=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-e17-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg#查看是否可有
yum list | grep kubeadm
#如果出现import gpg,则输入y进行确认#三个host都进行安装,可以重复上述操作,或者是哦那个scp path hostname:path的操作进行复制yum -y install kubeadm kubelet kubectl

        安装完成之后,需要配置kubelet

vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"systemctl enable kubelet

4.3 k8s镜像准备

        master安装镜像

#查看集群使用的容器镜像
kubeadm config images list#将其写入文件中方便下载
kubeadm config images list >> image.list#对文件进行更改设置
vim image.list
#更改内容为如下格式;
#!/bin/bash
img_list = '
镜像列表
'
for img in ${img_list}
dodocker pull $img
done#保存退出执行该文件
sh image.list#查看安装的镜像
docker images

        worker主机的镜像复制

#在master下保存worker中需要的镜像文件
docker save -o name.tar 要保存的镜像名#然后使用scp进行拷贝
scp name.tar worker:path#worker中加载拷贝的文件
docker load -i name.tar

4.4 集群初始化

        在master节点操作,需保存初始化时的连接信息。

kubeadm init --kubernetes-version=v1.17.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=主机ip#初始化之后创建kube文件
mkdir .kube
cp -i /etc/kubernetes/admin.conf .kube/config

        接着,网络配置官网为https://kubernetes.io/docs/concepts/cluster-administration/addons,但是学习时讲的是calico,所以就以calico为例,具体到时候可以根据自己需求替换即可。依次使用docker load -i tar名字进行加载,master和worker1/2均要进行操作。

        进行calico.yml文件的加载

kubectl apply -f calico.yml

        最后,进行worker1和worker2与master的连接,这一个信息在master初始化是会给出,需要保存。

kubeadm join 192.168.216.100:6443 --token uahni7.2wz17nyx8obxhfnh --discovery-token-ca-cert-hash
sha256:48486b2cd572881fa28184177d331353146f2692744d2cc6bfa21132f01c4478

        验证k8s集群是否可用

kubectl get nodes #查看节点状态
kubectl get cs #查看master组件信息
kubectl cluster-info #查看集群信息
kubectl get pods --namespace kube-system

5. kubectl的使用

5.1 kubectl的帮助

rpm -a | grep kubectl
kubectl --help

5.2 kubectl的子命令

类型命令描述
基础命令create通过文件名或标准输入创建资源
expose将一个资源公开为一个新的Service
run在集群中运行一个特定的镜像
set在对象上设置特定的功能
get显示一个或多个资源
explain文档参考资料
edit使用默认的编辑器编辑一个资源
delete通过文件名、标准输入、资源名称或标签选择器来删除资源
部署命令rollout管理资源分布
rolling-update对给定的复制控制器滚动更新
scale扩容或缩容pod数量,Deployment、ReplicaSet等
autoscale创建一个自动扩容或缩容并设置pod数量
集群管理命令certificate修改证书资源
cluster-info显示集群信息
top显示资源使用,需要heapster运行
cordon标记节点不可调度
uncordon标记节点可调度
drain驱逐节点上的应用,准备下线维护
taint

修改节点taint标记

故障诊断和调式命令describe显示特定资源的详细信息
logs在一个pod中打印一个容器日志
attach

附加到一个运行的容器

exec执行命令到容器
port-forward转发一个或多个本地端口到一个pod
proxy运行一个proxy到Kubernetes_API_server
cp拷贝文件或目录到容器中
auth检查授权
高级命令apply通过文件名或标准输入对资源应用进行配置
patch使用补丁修改、更新资源的字段
replace通过文件名或标准输入替换一个资源
convert不同API版本之间转换配置文件
设置命令label更新资源上的标签
annotate更新资源上的注释
completion实现kubectl工具的自动补全
其他命令api-versions打印受支持的API版本
config修改kubeconfig文件
help所有命令帮助
plugin运行一个命令行插件
version打印版本信息

5.3 worker节点

#准备集群管理配置文件
mkdir .kube
scp master:path/.kube/config .kube/
#验证
kubectl get nodes

6. yaml的写法

        k8s集群中对资源管理和资源对象编排部署都可以通过yaml文件来解决,这种格式的文件又称为资源清单文件,通过kubectl命令执行yaml文件就可以对资源对象进行部署编排。

6.1 基本语法

        使用空格作为缩进,缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

        低版本缩进时不允许使用tab键,只能使用空格

        使用#标识注释

        数据结构为 键值对 的形式

6.2 常用字段

参数名字段类型说明
versionstringK8S API的版本,可以使用kubectl api-version查看
kindstringyaml文件定义的资源类型和角色
metadataobject元数据对象,固定值就写metadata

metadata.name

string元数据对象的名字,如命名pod名字
metadata.namespacestring元数据对象的命名空间
specobject详细定义对象,固定值就写spec

举例说明:

        创建一个namespace

apiVersion: v1
kind: Namespace
metadata: name: test

        创建一个pod

apiVersion: v1
kind: Pod
metadata: name: pod1
spec: containers: - name: nginx-containersimage: nginx:latest

7. Namespace

        命名空间。多租户情况下,实现资源隔离,该隔离属于逻辑隔离,属于管理边界,不属于网络边界。

7.1 查看namespace

kubectl get ns
#输出说明
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问
kube-node-lease k8s集群节点租约状态
kube-system k8s集群在使用

7.2 创建namespace

        方式一:使用create

kubectl create namespace test

        方式二:使用资源清单yaml,yaml格式如下

apiVersion: v1
kind: Namespace
metadata:name: test2
kubectl apply -f create_ns.yaml

7.3 删除namespace

        方式一:使用namespace名字删除

kubectl delete namespace test

        方式二:使用yaml删除

kubectl delete -f create_test.yaml

8. pod概念

        pod是k8s集群能调度的最小单元

8.1 查看pod

kubectl get pods
#查看指定namespace中的pod
kubectl get pods -n default

8.2 创建pod

kubectl apply -f create_pod.yaml

8.3 pod访问

        使用kubectl get pod -owide查看pod的ip地址

curl http://IP

8.4 删除pod

kubectl delete pods pod_name -n namespace
#如果pod有控制器则需要使用yaml删除
kubectl delete -f create_pod.yaml

9. controller概念

        控制器在k8s集群中,以loop方式监视pod状态,使pod一直处于用户期望状态。

        常见的pod控制器:

                Deployment:声明式更新控制器,用于发布无状态应用,默认为此版本

                ReplicaSet:副本集控制器,用于对pod进行副本规模扩展或者裁剪

                StatefulSet:有状态副本集,用于发布有状态应用

                DaemonSet:在k8s集群每一个node上运行一个副本,用于发布监控或日志收集类等应用

                Job:运行一次性作业任务

                CronJob:运行周期性作业任务

9.1 Deployment介绍

        具有上线部署、滚动升级、创建副本、回滚某一版本等功能

        创建及查看方式

kubectl run nginx-app --image:nginx:latest --image-pull-policy=IfNotPresent --replicas=2
#查看
kubectl get deployment
#使用yaml创建
#create-nginx-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata: nginx-app2
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginxapp2-containerimage: nginx:latestimagePullPolicy: IfNotPresentports:- name: nginxapp2containerPort: 80#创建应用指令
kubectl apply -f create-nginx-app.yaml

        删除时不能直接删除pod名称,pod会被重新拉起,需要删除部署的模式

#通过删除部署模式
kubectl delete deployment.app app名称
#通过资源清单删除
kubectl delete create-nginx-app.yaml

10. Service

        service是不是实体服务,是一条iptables或ipvs的转发规则。

        作用:通过service为pod客户端提供访问pod方法,通过使用pod标签与pod关联。

10.1 service类型

        ClusterIP:默认,分配一个集群内部可以访问的虚拟IP

        NodePort:在每个Node上分配一个端口作为外部访问入口

        LoadBalancer:工作在特定的Cloud Provider上

        ExternalName:表示把集群外部的服务引入集群内部中来,实现集群内部pod和外部服务的通信。

10.2 service参数

        port:访问serivce使用的端口

        targetPort:pod中容器端口

        NodePort:通过Node实现外网用户访问K8s集群内service

10.3 创建service与deployment类型应用关联

        在9.1创建deployment基础上进行

kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80

10.4 service查看命令

kubectl get svc
#查看端点
kubectl get endpoints

10.5 通过yaml资源清单创建ClusterIP类型的service

#deployment-service-clusterip.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-appslabels:apps: nginx
spec:replicas: 1selector:matchLables:apps: nginxtemplate:metadata:labels:apps: nginxspec:containers:- name: nginxapp2image: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-app2-svc
spec:type: ClusterIPports:- protocol: TCPport: 80targetPort: 80selector:apps: nginx

        使用yaml创建

kubectl apply -f deployment-service-clusterip.yaml

10.6 创建NodePort的service

#deployment-service-clusterip.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-appslabels:apps: nginx
spec:replicas: 1selector:matchLables:apps: nginxtemplate:metadata:labels:apps: nginxspec:containers:- name: nginxapp2image: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: nginx-app2-svc
spec:type: NodePortports:- protocol: TCPport: 80targetPort: 80nodePort: 30001selector:apps: nginx
http://www.xdnf.cn/news/1450405.html

相关文章:

  • doubletrouble: 1靶场渗透
  • ubuntu-24.04.3-live-server连接不上xhell
  • 当数据库宕机时,PostgreSQL 高可用在背后做了什么?
  • 探索 PostgreSQL 和 MySQL 之间的主要差异和相似之处,找到满足您项目需求的最佳数据库解决方案。
  • jQuery的$.Ajax方法分析
  • 低代码高效搭建应用,轻松应对多场景需求
  • 低代码选型避坑指南:告别封闭与绑定,星图云开发者平台定义开放灵活新标准
  • 3D 房地产地图 Web 应用
  • 从0到1搭建某铝箔智慧工厂网络:5G与WiFi 6助力智能制造
  • 渐变背景色和渐变字体颜色的实现方法
  • GPT-5冷酷操盘,游戏狼人杀一战封神!七大LLM狂飙演技,人类玩家看完沉默
  • 学习日记-SpringMVC-day49-9.4
  • 卫星通信+地面网络融合 Sivers半导体毫米波技术打通智慧交通最后一公里
  • DevOps平台选型指南:破解研发效率瓶颈,适配金融/政务/国产化场景的5大关键指标
  • E-E-A-T与现代SEO:赢得搜索引擎信任的完整策略
  • 高效办公新选择:艾克斯音频转文本工具——免费本地化AI识别神器
  • 第15章 Jenkins最佳实践
  • GitHub每日最火火火项目(9.4)
  • 在树莓派集群上部署 Distributed Llama (Qwen 3 14B) 详细指南
  • “乾坤大挪移”:耐达讯自动化RS485转Profinet解锁HMI新乾坤
  • 当Python遇见高德:基于PyQt与JS API构建桌面三维地形图应用实战
  • leetcode算法刷题的第二十六天
  • 软考中级习题与解答——第二章_程序语言与语言处理程序(2)
  • 用Logseq与cpolar:构建开源笔记的分布式协作系统
  • openEuler2403安装部署Kafka
  • 【图像处理基石】图像在频域处理和增强时,如何避免频谱混叠?
  • 机电装置:从基础原理到前沿应用的全方位解析
  • 大模型RAG项目实战:阿里巴巴GTE向量模型
  • 【算法--链表题5】24.两两交换链表中的节点--通俗讲解
  • 【Unity开发】热更新学习——AssetBundle