kubernetes简单入门实战
本章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其访问
Namespace
Namespace是k8s系统中一个非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
默认情况下,k8s集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个pod之间进行互相访问,那此时就可以将两个pod划分到不同的namespace下。k8s通过集群内部的资源分配到不同的namespace中,可以形成逻辑上的组,以方便不同的组的资源进行隔离使用和管理。
可以通过k8s的授权机制,将不同的namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合k8s的资源配额机制,限定不同租户能占用的资源,例如CPU使用量,内存使用量等,来实现租户可用资源的管理。

k8s在集群启动之后,会默认创建几个namespace
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 11m
kube-node-lease Active 11m
kube-public Active 11m
kube-system Active 11m
查看
#1.查看所有的ns
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 11m
kube-node-lease Active 11m
kube-public Active 11m
kube-system Active 11m#2.查看指定的ns
[root@k8s-master ~]# kubectl get ns default
NAME STATUS AGE
default Active 18m#3.输出指定格式-o wide json yaml
[root@k8s-master ~]# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: "2024-11-13T02:30:46Z"labels:kubernetes.io/metadata.name: defaultname: defaultresourceVersion: "206"uid: b80ba6be-a00f-42e7-868b-9319501d5cf9
spec:finalizers:- kubernetes
status:phase: Active#4.查看详情
[root@k8s-master ~]# kubectl describe ns default
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: ActiveNo resource quota.No LimitRange resource.
创建
[root@k8s-master ~]# kubectl create ns dev
namespace/dev created
删除
[root@k8s-master ~]# kubectl delete ns dev
namespace "dev" deleted
配置方式
首先准备一个yaml配置文件,ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:name: dev
然后就可以执行对应的创建和删除
#创建
kubectl create -f ns-dev.yaml#删除
kubectl delete -f ns-dev.yaml
Pod
Pod是k8s集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在Pod中。Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器

k8s在集群启动后,集群中的各个组件也都是以Pod方式运行。可以通过下面命令查看
[root@k8s-master ns]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-cd8566cf-m7gzh 1/1 Running 0 4h5m
calico-node-2h55h 1/1 Running 0 4h5m
calico-node-586wp 1/1 Running 0 4h5m
calico-node-n5wk7 1/1 Running 0 4h5m
coredns-6d8c4cb4d-66rzr 1/1 Running 0 4h7m
coredns-6d8c4cb4d-8nsnk 1/1 Running 0 4h7m
etcd-k8s-master 1/1 Running 1 4h8m
kube-apiserver-k8s-master 1/1 Running 1 4h8m
kube-controller-manager-k8s-master 1/1 Running 18 4h8m
kube-proxy-2bxnm 1/1 Running 0 4h7m
kube-proxy-qpvzh 1/1 Running 0 4h7m
kube-proxy-tdrjj 1/1 Running 0 4h7m
kube-scheduler-k8s-master 1/1 Running 18 4h8m
创建并运行
k8s没有提供单独运行Pod的命令,都是通过Pod控制器来实现
#命令格式:kubectl run (pod控制器名称)[参数]
#--image 指定pod的镜像
#--port 指定端口
#--namespace 指定namespace[root@k8s-master ns]# kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace dev
pod/nginx created
查看pod信息
#查看pod基本信息
[root@k8s-master ns]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 22s#查看pod的详细信息
[root@k8s-master ns]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 4m46s 10.244.169.129 k8s-node2 <none> <none>
[root@k8s-master ns]# kubectl describe pod nginx -n dev
删除指定pod
[root@k8s-master ns]# kubectl delete pod nginx2 -n dev
pod "nginx2" deleted
配置操作
创建一个pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: dev
spec:containers:- image: nginx:1.17.1imagePullPolicy: IfNotPresentname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
执行对应的创建和删除
#创建
kubectl create -f pod-nginx.yaml#删除
kubectl delete -f pod-nginx.yaml
Label
Label是k8s中一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
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”
标签定义完毕之后,还要考虑到标签的选择,这就要使用到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"或"slave"的对象
name not in (frontend):选择所有包含Label中的key="name"且value不等于"frontend"的对象
标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如:
name=slave,env!=production
name not in (frontend),env!=production
命令方式
#为pod资源打标签
[root@k8s-master pod]# kubectl label pod nginx version=1.0 -n dev
pod/nginx labeled#为pod资源更新标签
[root@k8s-master pod]# kubectl label pod nginx version=2.0 -n dev --overwrite
pod/nginx labeled#查看标签[root@k8s-master pod]# kubectl get pod nginx -n dev --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 2m20s version=2.0#筛选标签
[root@k8s-master pod]# kubectl get pod -n dev -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 3m14s version=2.0
[root@k8s-master pod]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.#删除标签
[root@k8s-master pod]# kubectl label pod nginx -n dev version-
pod/nginx unlabeled
配置方式
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: devlabels:version: "3.0"env: "test"
spec:containers:- image: nginx:1.17.1name: podports:- name: nginx-portcontainerPort: 80protocol: TCP
更新命令可以是:kubectl apply -f pod-nginx.yaml
Deployment
在k8s中,Pod是最小的控制单元,但是k8s很少直接控制pod,一般都是通过pod控制器来完成的。pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod.
在k8s中pod控制器的种类有很多,现只介绍Deployment
配置方式
创建一个deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-deploymentnamespace: dev
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:1.17.1ports:- containerPort: 80protocol: TCP
执行:kubectl create -f deployment-nginx.yaml
#查看deployment的信息
[root@k8s-master deployment]# kubectl get deployment -n dev
NAME READY UP-TO-DATE AVAILABLE AGE
my-deployment 3/3 3 3 2m36s
[root@k8s-master deployment]# kubectl get deploy -n dev -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
my-deployment 3/3 3 3 3m48s my-container nginx:1.17.1 app=my-app#删除deployment
[root@k8s-master deployment]# kubectl delete deployment my-deployment -n dev
deployment.apps "my-deployment" deleted
Service
虽然每个pod都会分配一个单独的pod ip,然而却存在如下问题:
- pod ip会随着pod的重建产生变化
- pod ip仅仅是集群内可见的虚拟ip,外部无法访问
这样对于访问这个服务带来的难度。因此,k8s设计了service来解决这个问题。
service可以看作是一组同类pod对外访问接口。借助service,应用可以方便地实现服务发现和负载均衡

操作一:创建集群内部可访问的service
暴露service 绑定对应的deployment是解决如果deployment控制的pod如果重建会产生不同的ip不会影响到外部访问
#暴露service
[root@k8s-master deployment]# kubectl expose deploy my-deployment --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
service/svc-nginx exposed#查看service
[root@k8s-master deployment]# kubectl get service -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-nginx ClusterIP 10.108.254.244 <none> 80/TCP 9s
[root@k8s-master deployment]# kubectl get svc svc-nginx -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx ClusterIP 10.108.254.244 <none> 80/TCP 69s app=my-app#访问
[root@k8s-master deployment]# curl 10.108.254.244:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
操作二:创建集群外部也可以访问的Service
#上面创建的Service的type类型为ClusterIP,这个ip地址只在集群内部可访问
#如果需要创建外部也可以访问的Service,需要修改type为NodePort
[root@k8s-master deployment]# kubectl expose deploy my-deployment --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
service/svc-nginx2 exposed#查看
[root@k8s-master deployment]# kubectl get svc -n dev -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
svc-nginx ClusterIP 10.108.254.244 <none> 80/TCP 51m app=my-app
svc-nginx2 NodePort 10.100.160.81 <none> 80:30081/TCP 13s app=my-app#在集群外通过节点IP:30081访问服务了
http://192.168.225.10:30081/
删除Service
[root@k8s-master deployment]# kubectl delete svc svc-nginx -n dev
service "svc-nginx" deleted
配置方式
创建一个svc-nginx.yaml
apiVersion: v1
kind: Service
metadata:name: svc-nginxnamespace: dev
spec:clusterIP: 10.109.179.231ports:- port: 80protocol: TCPtargetPort: 80selector:app: my-apptype: ClusterIP
执行创建和删除命令
kubectl create -f svc-nginx.yaml
kubectl delete -f svc-nginx.yaml
相关文章:
kubernetes简单入门实战
本章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其访问 Namespace Namespace是k8s系统中一个非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,k8s集群中的所有的Pod都是可以相…...
Python连接Mysql、Postgre、ClickHouse、Redis常用库及封装方法
博主在这里分享一些常见的python连接数据库或中间件的库和封装方案,希望对大家有用。 Mysql封装 #!/usr/bin/python # -*- coding: utf-8 -*- import sys import pymysql from settings import MYSQL_DB, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, EN…...
如何修改npm包
前言 开发中遇到一个问题,配置 Element Plus 自定义主题时,添加了 ElementPlusResolver({ importStyle: "sass" }) 后,控制台出现报错,这是因为 Dart Sass 2.0 不再支持使用 !global 来声明新变量,虽然当前…...
Django 2024全栈开发指南(三):数据库模型与ORM操作(上篇)
目录 一、模型的定义二、数据迁移三、数据表关系四、数据表操作4.1 Shell工具4.2 数据新增4.3 数据修改4.4 数据删除4.5 数据查询 Django 对各种数据库提供了很好的支持,包括 PostgreSQL、MySQL、SQLite 和 Oracle,而且为这些数据库提供了统一的 API 方法…...
低代码可视化-uniapp开关选择组件-低码生成器
开关(Switch)选择组件是一种用户界面元素,允许用户在两种状态(通常是开/关、是/否、启用/禁用等)之间进行切换。这种组件在移动应用、桌面软件、网页以及物联网设备中广泛应用。以下是对开关Switch选择组件的详细介绍&…...
【arxiv‘24】Vision-Language Navigation with Continual Learning
论文信息 题目:Vision-Language Navigation with Continual Learning 视觉-语言导航与持续学习 作者:Zhiyuan Li, Yanfeng Lv, Ziqin Tu, Di Shang, Hong Qiao 论文创新点 VLNCL范式:这是一个新颖的框架,它使得智能体能够在适…...
如何在 Ubuntu 上安装 Jupyter Notebook
本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…...
免费申请 Let‘s Encrypt SSL 证书
免费申请 Lets Encrypt SSL 证书 在网络安全日益重要的今天,为网站启用 SSL 证书是保障数据安全和用户信任的关键。Lets Encrypt 提供的免费 SSL 证书是一个很好的选择。下面我们详细介绍如何为网站域名申请该证书。 一、准备工作 域名 确保已注册要使用 SSL 证书的…...
【JAVA】Java基础—面向对象编程:继承—重写父类方法
在Java开发中,重写(Override)是面向对象编程(OOP)中的一个重要概念。它允许子类提供父类方法的具体实现,从而改变或扩展父类的行为。重写是实现多态性的重要手段,使得程序在运行时能够根据对象的…...
【C++初阶】C++入门
1、C第一个程序 C是脱胎于C语言的,所以也包含了C语言绝大多数的内容,C兼容C语言绝大多数的语法,在C语言中能实现的程序在C中也是可以执行的,但需要将定义文件代码的后缀改为.cpp 就比如hello world程序 // test.cpp #include<stdio.h&g…...
自然推理系统:的拒取式的解析
要推导出 **"非A"** 的拒取式 (rejection form),首先我们要理解逻辑推理中几个基本的概念。 假设我们有以下前提: 1. **A → B** (如果A成立,那么B成立) 2. **非B** (B不成立) 我们…...
OceanBase 分区表详解
1、分区表的定义 在OceanBase数据库中,普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中,同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表,而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…...
Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别
我是你爹 LinkedList<> 和 ArrayDeque<> 的区别Queue接口 和 Deque接口区别Queue 的用法Deque 的用法 LinkedList<> 和 ArrayDeque<> 的区别 1. 数据结构实现方式: LinkedList: 基于链表结构,是一个双向链表。每个…...
freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题
采用 try (Writer writer new OutputStreamWriter(os, “UTF-8”)) UTF-8 内容转换 public static void setResponseHeader(HttpServletResponse response, String fileName) {try {// fileName "中文.xls";try {fileName new String(fileName.getBytes(),"…...
arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现
水果选择与管理:基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…...
docker使用,docker图形化界面+docker详细命令
DockerUI进入 docker container run --rm --name docker.ui -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui访问8999端口就行,就可以图形化管理Docker了 常规使用 搭建 sudo docker-compose build #有一些需要这条命令 su…...
idea项目运行时 java: 错误: 不支持发行版本 21
java项目运行时,同样的项目别的都是正常运行,单个这个项目一直报 java: 错误: 不支持发行版本 21, 报错的解释 这个错误表明你正在尝试使用Java编译器编译一个类,但是编译器遇到了一个它不支持的版本号,在这个上下文…...
hive alter table add columns 是否使用 cascade 的方案
结论 alter table xxx add columns 时加上 cascade 时,会把所有的分区都加上此字段。如果不加则只有新的分区会加上此字段,旧的分区没有此字段,即便数据文件里有对应的数据,也不能显示内容。 如果分区都是 insert overwrite 生成…...
手机怎么玩steam游戏?随时随地远程串流玩steam游戏教程
喜欢在steam上玩游戏的玩家有没有想过,其实这些游戏也能在手机上玩呢?不管是探索的开放世界游戏,还是紧张刺激的射击游戏,还是丰富剧情的视觉小说等等,这些游戏你都可以通过远程串流软件,来帮你实现在手机上…...
【使用antv g6实现拓扑图】
使用antv g6实现拓扑图 安装antv g6创建一个 div,并制定必须的属性 id定义初始化方法定义node节点数据将获取到的数据渲染进页面 安装antv g6 npm install antv/g6 --save import G6 from antv/g6;创建一个 div,并制定必须的属性 id 定义好展示id&…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
