kubernetes入门实战

文章目录

  • kubernetes入门实战
    • 一、 Namespace
    • 二、 Pod
    • 三、 Label
    • 四、 Deployment

一、 Namespace


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

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

[root@master ~]# kubectl  get namespace
NAME              STATUS   AGE
default           Active   10d    #  所有未指定Namespace的对象都会被分配在default命名空间
kube-flannel      Active   10d
kube-node-lease   Active   10d    #  集群节点之间的心跳维护,v1.13开始引入
kube-public       Active   10d    #  此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system       Active   10d    #  所有由Kubernetes系统创建的资源都处于这个命名空间

下面来看namespace资源的具体操作:

查看

[root@master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   10d
kube-flannel      Active   10d
kube-node-lease   Active   10d
kube-public       Active   10d
kube-system       Active   10d
[root@master ~]#

查看指定的ns

[root@master ~]# kubectl get ns default
NAME      STATUS   AGE
default   Active   10d
[root@master ~]#

指定输出格式

[root@master ~]#  kubectl get ns default -o yaml         //kubernetes支持的格式有很多,比较常见的是wide、json、yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: "2022-11-17T09:58:24Z"labels:kubernetes.io/metadata.name: defaultname: defaultresourceVersion: "192"uid: 60162bc0-cf70-4a4a-81b1-4629679f77b3
spec:finalizers:- kubernetes
status:phase: Active
[root@master ~]#

查看ns详情

[root@master ~]# kubectl describe ns default
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active         # Active 命名空间正在使用中  Terminating 正在删除命名空间# ResourceQuota 针对namespace做的资源限制# LimitRange针对namespace中的每个组件做的资源限制No resource quota.No LimitRange resource.
[root@master ~]#

创建namespace

[root@master ~]# kubectl create ns aa
namespace/aa created

删除namespace

[root@master ~]# kubectl delete ns aa
namespace "aa" deleted

配置方式
首先准备一个yaml文件:ns-aa.yaml

[root@master ~]# vim ns-aa.yaml
apiVersion: v1
kind: Namespace
metadata:name: aa[root@master ~]# kubectl create -f ns-aa.yaml
namespace/aa created
[root@master ~]# kubectl delete -f ns-aa.yaml
namespace "aa" deleted

二、 Pod


Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。
Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。


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

[root@master ~]# kubectl get pod -n kube-system
NAME                                         READY   STATUS        RESTARTS      AGE
coredns-c676cc86f-8qqq9                      1/1     Running       0             8m40s
coredns-c676cc86f-p54pj                      1/1     Running       0             8m40s
coredns-c676cc86f-rd8sx                      1/1     Terminating   0             10d
coredns-c676cc86f-zk7xs                      1/1     Terminating   0             10d
etcd-master.example.com                      1/1     Running       2 (15m ago)   10d
kube-apiserver-master.example.com            1/1     Running       2 (15m ago)   10d
kube-controller-manager-master.example.com   1/1     Running       2 (15m ago)   10d
kube-proxy-2kb94                             1/1     Running       2 (15m ago)   10d
kube-proxy-6n9mb                             1/1     Running       0             10d
kube-proxy-jwcq8                             1/1     Running       0             10d
kube-scheduler-master.example.com            1/1     Running       2 (15m ago)   10d
[root@master ~]#

创建并运行

kubernetes没有提供单独运行Pod的命令,都是通过Pod控制器来实现的

# 命令格式: kubectl run (pod控制器名称) [参数]
# --image  指定Pod的镜像
# --port   指定端口
# --namespace  指定namespace[root@master ~]# kubectl create -f ns-aa.yaml
namespace/aa created
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace aa
pod/nginx created

查看pod信息

[root@master ~]# kubectl get pods -n aa
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m16s# 查看Pod的详细信息
[root@master ~]# kubectl describe pod nginx -n aa
Name:             nginx
Namespace:        aa
Priority:         0
Service Account:  default
Node:             node1.example.com/192.168.89.10
Start Time:       Mon, 28 Nov 2022 12:14:17 +0800
Labels:           run=nginx
Annotations:      <none>
Status:           Running
IP:               10.244.1.5
IPs:IP:  10.244.1.5
Containers:nginx:Container ID:   containerd://aefbeb7bb1a33fa6adbb9040552d0240f072c1ad411631c01d770504337af15fImage:          nginx:latestImage ID:       docker.io/library/nginx@sha256:e209ac2f37c70c1e0e9873a5f7231e91dcd83fdf1178d8ed36c2ec09974210baPort:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Mon, 28 Nov 2022 12:14:24 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sffr8 (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:kube-api-access-sffr8:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type     Reason            Age    From               Message----     ------            ----   ----               -------Warning  FailedScheduling  2m59s  default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 node(s) had untolerated taint {node.kubernetes.io/unreachable: }. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.Normal   Scheduled         88s    default-scheduler  Successfully assigned aa/nginx to node1.example.comNormal   Pulling           91s    kubelet            Pulling image "nginx:latest"Normal   Pulled            85s    kubelet            Successfully pulled image "nginx:latest" in 6.323156243sNormal   Created           85s    kubelet            Created container nginxNormal   Started           85s    kubelet            Started container nginx
[root@master ~]#

访问Pod

# 获取podIP
[root@master ~]# kubectl get pods -n aa -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP           NODE                NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          4m29s   10.244.1.5   node1.example.com   <none>           <none>#访问POD
[root@master ~]# curl http://10.244.1.5:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

删除指定Pod

[root@master ~]# kubectl delete pod nginx -n aa
pod "nginx" deleted# 如果create,显示删除Pod成功,但是再查询,发现又新产生了一个 ;
kubectl  create deployment nginx --image nginx --port 80 -n dev  //当前pod是由pod控制器管理
kubectl run nginx  --image  nginx  --port 80  -n  dev  //自主式管理pod[root@master ~]# kubectl  create deployment nginx --image nginx --port 80 -n aa
deployment.apps/nginx created
[root@master ~]#  kubectl get pods -n aa
NAME                    READY   STATUS    RESTARTS   AGE
nginx-ff6774dc6-fk8t9   1/1     Running   0          31s[root@master ~]# kubectl run nginx  --image  nginx  --port 80  -n aa
pod/nginx created
[root@master ~]#  kubectl get pods -n aa
NAME                    READY   STATUS    RESTARTS   AGE
nginx                   1/1     Running   0          13s# 这是因为当前Pod是由Pod控制器创建的,控制器会监控Pod状况,一旦发现Pod死亡,会立即重建# 此时要想删除Pod,必须删除Pod控制器
# 先来查询一下当前namespace下的Pod控制器[root@master ~]# kubectl get deploy -n aa
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           3m4s# 接下来,删除此PodPod控制器
[root@master ~]# kubectl delete deploy nginx -n aa
deployment.apps "nginx" deleted# 稍等片刻,再查询Pod,发现Pod被删除了
[root@master ~]# kubectl get pods -n  aa
No resources found in aa namespace.

配置操作

[root@master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: aa
spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
[root@master ~]# kubectl create -f pod-nginx.yaml
pod/nginx created
[root@master ~]# kubectl delete -f pod-nginx.yaml
pod "nginx" deleted
[root@master ~]#

三、 Label


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”

标签定义完毕之后,还要考虑到标签的选择,这就要使用到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@master ~]# kubectl label pod nginx version=1.0 -n  aa
pod/nginx labeled# 为pod资源更新标签
[root@master ~]#  kubectl label pod nginx version=2.0 -n aa --overwrite
pod/nginx labeled# 查看标签
[root@master ~]# kubectl get pod nginx  -n aa --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          2m49s   version=2.0
[root@master ~]## 筛选标签
[root@master ~]# kubectl get pod -n aa -l version=2.0  --show-labels
NAME    READY   STATUS    RESTARTS   AGE     LABELS
nginx   1/1     Running   0          3m19s   version=2.0[root@master ~]# kubectl get pod -n aa -l version!=2.0  --show-labels
No resources found in aa namespace.#删除标签
[root@master ~]#  kubectl label pod nginx version- -n aa
pod/nginx unlabeled

配置方式

[root@master ~]# vim pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: aalabels:version: "3.0"env: "test"
spec:containers:- image: nginx:latestname: podports:- name: nginx-portcontainerPort: 80protocol: TCP
[root@master ~]# kubectl apply -f pod-nginx.yaml
Warning: resource pods/nginx is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
pod/nginx configured

四、 Deployment


在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment。


命令操作

# 命令格式: kubectl create deployment 名称  [参数]
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace[root@master ~]# kubectl create deploy nginx --image=nginx:latest --port=80 --replicas=3 -n aa
deployment.apps/nginx created# 查看创建的Pod
[root@master ~]# kubectl get pods -n aa
NAME                    READY   STATUS    RESTARTS   AGE
nginx-cd55c47f5-bmtrg   1/1     Running   0          28s
nginx-cd55c47f5-cvw7t   1/1     Running   0          28s
nginx-cd55c47f5-flkqz   1/1     Running   0          28s# 查看deployment的信息
[root@master ~]#  kubectl get deploy -n aa
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   3/3     3            3           83s# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量[root@master ~]#  kubectl get deploy -n aa -o wide
NAME    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx   3/3     3            3           2m    nginx        nginx:latest   app=nginx
[root@master ~]## 查看deployment的详细信息
[root@master ~]# kubectl describe deploy nginx -n aa
Name:                   nginx
Namespace:              aa
CreationTimestamp:      Mon, 28 Nov 2022 13:11:02 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:Labels:  app=nginxContainers:nginx:Image:        nginx:latestPort:         80/TCPHost Port:    0/TCPEnvironment:  <none>Mounts:       <none>Volumes:        <none>
Conditions:Type           Status  Reason----           ------  ------Available      True    MinimumReplicasAvailableProgressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-cd55c47f5 (3/3 replicas created)
Events:Type    Reason             Age    From                   Message----    ------             ----   ----                   -------Normal  ScalingReplicaSet  2m32s  deployment-controller  Scaled up replica set nginx-cd55c47f5 to 3
[root@master ~]## 删除
[root@master ~]# kubectl delete deploy nginx -n aa
deployment.apps "nginx" deleted

配置操作

[root@master ~]# vim deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxnamespace: aa
spec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:latestname: nginxports:- containerPort: 80protocol: TCP
# 创建
[root@master ~]# kubectl create -f deploy-nginx.yaml
deployment.apps/nginx created# 删除
[root@master ~]# kubectl delete -f deploy-nginx.yaml
deployment.apps "nginx" deleted

kubernetes入门实战相关推荐

  1. K8S 入门实战 (1)

    Docker 安装 # 1. 查看机器信息,内核版本要求 3.8 以上$ uname -aLinux centos8 5.11.12-300.el8.aarch64 #1 SMP Fri Jul 30 ...

  2. 零入门kubernetes网络实战-20->golang编程syscall操作tun设备介绍

    <零入门kubernetes网络实战>视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是使用g ...

  3. 零入门kubernetes网络实战-3->Underlay网络与Overlay网络总结

    <零入门kubernetes网络实战>视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章主要用于收集.整理.总结关于Underla ...

  4. 零入门kubernetes网络实战-7->Mac环境下为虚拟机磁盘空间进行扩容

    <零入门kubernetes网络实战>视频专栏地址 https://www.ixigua.com/7193641905282875942 在Mac环境下,使用PD软件创建的虚拟机磁盘空间不 ...

  5. 零入门kubernetes网络实战-31->基于bridge+veth pair+MASQUERADE技术实现内网可以访问外网

    <零入门kubernetes网络实战>视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章我们使用na ...

  6. 零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例

    <零入门kubernetes网络实战>视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试 ...

  7. Docker、Mesos和Marathon剖析以及入门实战

    本文讲的是Docker.Mesos和Marathon剖析以及入门实战,[编者的话]国外广为流传的一个比喻是:在传统服务模式下,可以想象服务器就是IT的宠物(Pets),给它们取名字,并精心抚养长大,当 ...

  8. Docker入门实战看这篇就够了(最新详细以及踩过的坑)

    Docker入门实战看这篇就够了 前言 初识 是什么 容器与虚拟机 能干什么 去哪玩 安装 先决条件 查看自己的内核 安装所需的软件包(支持devicemapper存储类型) 设置镜像的仓库 设置yu ...

  9. 企业入门实战--k8s之Ingress加密、认证以及地址重写

    企业入门实战--k8s之Ingress加密.认证以及地址重写 一.Ingress 加密 二.Ingress 认证 三.Ingress 地址重定向 一.Ingress 加密 加密访问80默认重定向443 ...

最新文章

  1. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
  2. [十三]JavaIO之PushBackInputStream
  3. 2021 年百度之星·程序设计大赛 - 初赛二 1001 签到(找规律,快速幂)
  4. 成功将用intelli idea 建立的项目打包成jar文件,并在Linux上成功运行
  5. Android 和 Chrome OS 融合的可能性
  6. 中专计算机专业教研方案,教研活动实施方案电脑基础知识IT计算机专业资料-教研活动实施方案.pdf...
  7. 骑车与走路(信息学奥赛一本通-T1050)
  8. Dell Latitude 3490 使用 UEFI+GPT 安装 Win7 x64
  9. 将C/C++代码中的注释删除
  10. Kibana图形、报表分析
  11. 【OpenCV】Retinex图像增强(SSR,MSR,MSRCR)
  12. 955 互联网公司白名单来了!
  13. 聚宽macd底背离_MACD背离技术分析(图解)
  14. JanusGraph批量导入数据代码总结
  15. 精读《图解密码技术》——第十章 证书
  16. 使用自定义的dns服务器,快速搭建自己的DNS服务器
  17. 用python模拟登录12306
  18. php许愿墙mysql,许愿墙—许下你的愿望
  19. 转型AI ,80后华为Java工程师的故事
  20. 【更新】数据库解决方案Data Abstract 9发布丨附下载

热门文章

  1. Deep Lab 系列总结
  2. CSS面试题整理汇总
  3. UDS诊断系列介绍08-19服务
  4. 关于scipy库里面的DCT离散余弦变换函数
  5. 计算机网络——计算机网络常见面试题总结
  6. lect01_codes02_numpy
  7. Cisco Packet Tracer(对cisco模拟器的初识+路由基本配置)
  8. 开启xmp1还是2_2020年11月2日大盘走势总结
  9. JAVA设计模式-创建模式-工厂模式-简单工厂模式/静态工厂模式
  10. 相对路径与绝对路径的写法及区别