星途物语 星途物语
首页
  • 随手记录
  • 故障处理
  • Nginx
  • MySQL
  • Ansible
  • Nexus
  • Tomcat
  • Docker
  • Zabbix
  • Prometheus
  • Git
  • GitLab
  • Jenkins
  • Kubernetes
  • Shell
  • Python
  • 圈圈空间
  • 做饭这件事
收藏站点
留言板
归档
GitHub (opens new window)

星途物语

尚记时,记之
首页
  • 随手记录
  • 故障处理
  • Nginx
  • MySQL
  • Ansible
  • Nexus
  • Tomcat
  • Docker
  • Zabbix
  • Prometheus
  • Git
  • GitLab
  • Jenkins
  • Kubernetes
  • Shell
  • Python
  • 圈圈空间
  • 做饭这件事
收藏站点
留言板
归档
GitHub (opens new window)
  • 随手记录

    • QPS优化记录
    • 阿里云SLB演示
    • DDOS预防
    • Linux内核优化
    • rsync同步守护进程
    • NFS文件同步
    • Tomcat升级
    • 编译安装mysql后添加到systemd管理
    • 防火墙笔记
    • python自动化巡检服务器
  • 故障处理

    • 处理防MIME攻击后出现的问题解决
  • MySQL学习笔记

    • MySQL5.7安装
    • MySQL常用操作语句
    • MySQL主从架构实施
    • MySQL主主架构实施
    • MySQL MHA高可用实施
    • MyCat读写分离
    • MySQL创建用户时的授权
    • MySQL备份
    • MySQL通配符
  • Nginx学习笔记

    • 状态码含义
    • 匹配优先级
    • Nginx常用操作
    • 添加第三方模块
    • 关于路径匹配
    • 转发和重写
    • 内置变量
    • Nginx配置文件结构
  • Tomcat学习笔记

    • 部署Tomcat
    • 修改发布目录
    • Tomcat调优
  • Redis学习笔记

    • 通过 tar.gz 包安装部署 redis
    • redis 配置文件
    • 哨兵集群
    • redis常用命令
    • 虚拟机安装 redis.tar.gz 遇到的问题
  • Ansible学习笔记

    • 部署和使用 ansible
    • ansible 自带的密码认证参数
    • 批量免密操作:批量分发公钥
    • 配置主机清单
    • ansible 小知识
    • 模块介绍
    • 剧本
    • 一键部署 rsync 环境
    • 批量安装一个tomcat
    • 批量安装一个nginx
    • 批量安装 zabbix-agent
  • Zabbix学习笔记

    • 部署 zabbix 服务端、客户端
    • 自定义监控
    • 触发器
    • 监控项类型
    • 简单检查模式
    • zabbix web 界面结构信息
    • 邮件报警
    • 微信报警
    • snmp 监控网络设备
    • 部署 zabbix 服务端、客户端
    • jmx 监控 java 应用
    • ipmi 监控硬件
    • 自动化注册
    • 监控项的主要项和相关项
    • percona 监控 mysql
  • Git学习笔记

    • 配置 git
    • 常用命令
  • GitLab学习笔记

    • 环境准备
    • 安装 gitlab
    • gitlab 忘记 root 管理员密码的处理办法
  • Jenkins学习笔记

    • 安装部署
    • jenkins 使用脚本完成项目构建
    • jenkins 自动构建最新项目
    • 将 jenkins 自动部署的结果返回给 gitlab
    • jenkins 上线 java 项目
    • jenkins pipeline
  • Docker学习笔记

    • 安装 docker
    • 配置 docker 源
    • docker 中的常见名词
    • 镜像管理命令
    • 容器管理命令
    • 创建容器
    • 数据卷
    • docker network
    • 搭建 LNMP
    • Dockerfile
    • Dockerfile 搭建 tomcat
    • docker 镜像磁盘扩容
    • docker composer
    • Harbor 私有镜像仓库
    • docker 面试题
    • docker desktop 运行时与虚拟机冲突
    • docker离线安装
  • Nexus学习笔记
  • Prometheus学习笔记

    • 核心组件
    • 工作原理
    • 安装和配置
    • 启动 Prometheus
    • PromQL 使用
    • 数据模型
    • Exporter
    • 演示服务
    • Grafana 数据可视化
    • Prometheus 告警
  • Kubernetes学习笔记

    • K8S的介绍
    • K8S集群环境的搭建
    • K8S资源管理
    • K8S的实战入门
      • K8S的实战入门
        • 1.NameSpace
        • 1.1 概述
        • 1.2 应用示例
        • 2.Pod
        • 2.1 概述
        • 2.2 语法及应用示例
        • 3.Label
        • 3.1 概述
        • 3.2 语法及应用示例
        • 4.Deployment
        • 4.1 概述
        • 4.2 语法及应用示例
        • 5.Service
        • 5.1 概述
        • 5.2 语法及应用示例
        • 5.2.1 创建集群内部可访问的Service
        • 5.2.2 创建集群外部可访问的Service
        • 5.2.3 删除服务
        • 5.2.4 对象配置方式
  • 运维
  • Kubernetes学习笔记
星途物语
2025-05-14
目录

K8S的实战入门

# K8S的实战入门

# 1.NameSpace

# 1.1 概述

  • Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离
  • 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理
  • 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理
Namespace概述

kubernetes在集群启动之后,会默认创建几个namespace

[root@master ~]# kubectl get namespace
NAME              STATUS   AGE
default           Active   24h
kube-flannel      Active   24h
kube-node-lease   Active   24h
kube-public       Active   24h
kube-system       Active   24h
---------------------------
#default 		--- 所有未指定NameSpace的资源都会被分配到default命名空间
#kube-node-lease --- 节点之间的心跳维护(v1.13开始引入)
#kube-public 	--- 此命名空间下的资源可以被所有人访问(包括未认证用户)
#kube-system 	--- 所有由K8S创建的资源都在这个命名空间内
1
2
3
4
5
6
7
8
9
10
11
12

# 1.2 应用示例

#查看所有的命名空间
kubectl get namespace
kubectl get ns
#查看指定的命名空间
kubectl get namespace default
kubectl get ns default
#指定命名空间的输出格式
kubectl get ns default -o wide
kubectl get ns default -o json
kubectl get ns default -o yaml
#查看命名空间的详情
kubectl describe namespace default
kubectl describe ns default
---------------------------
[root@master ~]# kubectl describe namespace default
Name:         default
Labels:       <none>
Annotations:  <none>
Status:       Active #表示命名空间正在使用中;Teminating 表示正在删除命名空间

No resource quota. #针对命名空间做的资源限制

No LimitRange resource. #针对命名空间中每个组件做的资源限制
---------------------------
#创建命名空间
kubectl create namespace dev
kubectl create ns dev
#删除命名空间
kubectl delete namespace dev
kubectl delete ns dev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

命令式对象配置

#新建ns-dev.yaml
cat << EOF > ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev
EOF
#通过命令式对象配置进行创建和删除
kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml
1
2
3
4
5
6
7
8
9
10

# 2.Pod

# 2.1 概述

Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中

Pod可以认为是容器的封装,一个Pod中可以存在一个或多个容器

Pod概述

kubernetes在集群启动之后,集群中的各个组件也是以Pod方式运行的,可以通过下面的命令查看

kubectl get pods -n kube-system
1
image-20250506155804305

# 2.2 语法及应用示例

语法:创建并运行Pod

kubectl run (Pod的名称) [参数]
# --image 指定Pod的镜像
# --port 指定端口
# --namespace 指定namespace
1
2
3
4

示例:在名称为dev的namespace下创建一个Nginx的Pod

kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev
1
image-20250506160243879

语法: 查询所有Pod的基本信息

kubectl get pods [-n 命名空间的名称]
1

示例:查询名称为dev的namespace下的所有Pod的基本信息

kubectl get pods -n dev
1

语法:查看Pod的详细信息

kubectl describe pod pod的名称 [-n 命名空间名称]
1

示例:查看名称为dev的namespace下的Pod的名称为nginx的详细信息

kubectl describe pod nginx -n dev
1
image-20250506160550950

语法:Pod的访问

# 获取Pod的IP
kubectl get pods [-n dev] -o wide

# 通过curl访问
curl ip:端口
1
2
3
4
5

示例:访问Nginx的Pod

kubectl get pods -n dev -o wide

curl 10.244.1.19
1
2
3
image-20250506160826479 image-20250506160849274

语法:删除指定的Pod

kubectl delete pod pod的名称 [-n 命名空间]
1

示例:删除Nginx的Pod

kubectl delete pod nginx -n dev
1

命令式对象配置

#新建pod-nginx.yaml
cat << EOF > pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
EOF
#执行创建和删除命令
kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 3.Label

# 3.1 概述

Label是kubernetes的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择

Label的特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等
  • 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除

可以通过Label实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作

一些常用的Label标签示例如下:
	版本标签:“version”:”release”,”version”:”stable” 等等
	环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro” 等等
	架构标签:“tier”:”frontend”,”tier”:”backend”  等等
1
2
3
4

标签定义完毕之后,还要考虑到标签的选择,这就要用到Label Selector,即

  • Label用于给某个资源对象定义标识
  • Label Selector用于查询和筛选拥有某些标签的资源对象

当前有两种Label Selector

  • 基于等式的Label Selector
    • name=slave:选择所有包含Label中的key=“name”并且value=“slave”的对象
    • env!=production:选择所有包含Label中的key=“env”并且value!=“production”的对象
  • 基于集合的Label Selector
    • name in (master,slave):选择所有包含Label中的key=“name”并且value=“master”或value=“slave”的对象
    • name not in (master,slave):选择所有包含Label中的key=“name”并且value!=“master”和value!=“slave”的对象

标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号(,)进行分隔即可

  • name=salve,env!=production
  • name not in (master,slave),env!=production

# 3.2 语法及应用示例

语法:为资源打标签

kubectl label pod xxx key=value [-n 命名空间]
1

示例:为Nginx的Pod打上标签

kubectl label pod nginx version=1.0 -n dev
1
image-20250506211610933

语法:更新资源的标签

kubectl label pod xxx key=value [-n 命名空间] --overwrite
1

示例:为Nginx的Pod更新标签

kubectl label pod nginx version=2.0 -n dev --overwrite
1

语法:查看标签

kubectl get pod xxx [-n 命名空间] --show-labels
1

示例:显示Nginx的Pod的标签

kubectl get pod nginx -n dev --show-labels
1

语法:筛选标签

kubectl get pod -l key=value [-n 命名空间] --show-labels
1

示例:筛选版本号是2.0的在名称为dev的namespace下的Pod

kubectl get pod -l version=2.0 -n dev --show-labels
1

语法:删除标签

kubectl label pod xxx key- [-n 命名空间]
1

示例:删除名称为dev的namespace下的Nginx的Pod上的标签

kubectl label pod nginx version- -n dev
1

命令式对象配置

#新建pod-nginx.yaml
cat << EOF > pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0"
    env: "test"
spec:
  containers:
  - image: nginx:1.17.1
    imagePullPolicy: IfNotPresent
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
EOF
#执行创建和删除命令
kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 4.Deployment

# 4.1 概述

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的

Pod控制器用于Pod的管理,确保Pod资源符合预期的状态,当Pod的资源出现故障的时候,会尝试进行重启或重建Pod

在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment

Deployment概述

# 4.2 语法及应用示例

特别注意:在v1.18版之后,kubectl run nginx --image=nginx --replicas=2 --port=80,会反馈Flag --replicas has been deprecated, has no effect and will be removed in the future,并且只会创建一个Nginx容器实例

语法:创建指定名称的deployement

kubectl create deployment xxx [-n 命名空间]
1
kubectl create deploy xxx [-n 命名空间]
1

示例:在名称为test的命名空间下创建名为nginx的deployment

kubectl create deployment nginx --image=nginx:1.17.1 -n test
1

语法:根据指定的deplyment创建Pod

kubectl scale deployment xxx [--replicas=正整数] [-n 命名空间]
1

示例:在名称为test的命名空间下根据名为nginx的deployment创建4个Pod

kubectl scale deployment nginx --replicas=4 -n test
1
image-20250506220205551

命令式对象配置

#创建一个deploy-nginx.yaml
cat << EOF > deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
EOF
#执行创建和删除命令
kubectl create -f deploy-nginx.yaml
kubectl delete -f deploy-nginx.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

语法:查看创建的Pod

kubectl get pods [-n 命名空间]
1

示例:查看名称为dev的namespace下通过deployment创建的3个Pod

kubectl get pods -n dev
1
image-20250506220338940

语法:查看deployment的信息

kubectl get deployment [-n 命名空间]
1
kubectl get deploy [-n 命名空间]
1

示例:查看名称为dev的namespace下的deployment

kubectl get deployment -n dev
1
image-20250506220430540

语法:查看deployment的详细信息

kubectl describe deployment xxx [-n 命名空间]
1
kubectl describe deploy xxx [-n 命名空间]
1

示例:查看名为dev的namespace下的名为nginx的deployment的详细信息

kubectl describe deployment nginx -n dev
1
image-20250506220519916

语法:删除deployment

kubectl delete deployment xxx [-n 命名空间]
1
kubectl delete deploy xxx [-n 命名空间]
1

示例:删除名为dev的namespace下的名为nginx的deployment

kubectl delete deployment nginx -n dev
1

# 5.Service

# 5.1 概述

我们已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务,虽然每个Pod都会分配一个单独的Pod的IP地址,但是却存在如下的问题:

  • Pod的IP会随着Pod的重建产生变化
  • Pod的IP仅仅是集群内部可见的虚拟的IP,外部无法访问
image-20250507092938278

这样对于访问这个服务带来了难度,因此,kubernetes设计了Service来解决这个问题

Service可以看做是一组同类的Pod对外的访问接口,借助Service,应用可以方便的实现服务发现和负载均衡

Service概述

# 5.2 语法及应用示例

# 5.2.1 创建集群内部可访问的Service

语法:暴露Service

kubectl expose deployment xxx --name=服务名 --type=ClusterIP --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
#会产生一个CLUSTER-IP,这个就是service的IP,在Service的生命周期内,这个地址是不会变化的
1
2

示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx1

kubectl expose deployment nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n test
1

语法:查看Service

kubectl get service [-n 命名空间] [-o wide]
1

示例:查看名为test的命名空间的所有Service

kubectl get service -n test
1
image-20250507095840764
# 5.2.2 创建集群外部可访问的Service

语法:暴露Service

kubectl expose deployment xxx --name=服务名 --type=NodePort --port=暴露的端口 --target-port=指向集群中的Pod的端口 [-n 命名空间]
# 会产生一个外部也可以访问的Service
1
2

示例:暴露名为test的namespace下的名为nginx的deployment,并设置服务名为svc-nginx2

kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n test
1

语法:查看Service

kubectl get service [-n 命名空间] [-o wide]
1

示例:查看名为test的命名空间的所有Service

kubectl get service -n test
1
# 5.2.3 删除服务

语法:删除服务

kubectl delete service xxx [-n 命名空间]
1

示例:删除服务

kubectl delete service svc-nginx1 -n test
1
# 5.2.4 对象配置方式

示例:对象配置方式

#新建svc-nginx.yaml,内容如下
cat << EOF > svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clusterIP: 10.109.179.231
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP
EOF
#执行创建和删除命令
kubectl  create  -f  svc-nginx.yaml
kubectl  delete  -f  svc-nginx.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Kubernetes
K8S资源管理

← K8S资源管理

Theme by Vdoing | Copyright © 2025-2025 | 鄂ICP备2024086820号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式