热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes(K8S)入门进阶实战完整教程04k8s的实战入门

本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问Namespace●Namespace是kubernetes系统中一种非常重要的资源,它的主

本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问


Namespace

● Namespace是kubernetes系统中一种非常重要的资源,它的主要作用是用来实现多套系统的资源隔离或者多租户的资源隔离。

● 默认情况下,kubernetes集群中的所有Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问,那么此时就可以将两个Pod划分到不同的Namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”,以方便不同的组的资源进行隔离使用和管理。

● 可以通过kubernetes的授权机制,将不同的Namespace交给不同租户进行管理,这样就实现了多租户的资源隔离。此时还能结合kubernetes的资源配额机制,限定不同租户能占用的资源,例如CPU使用量、内存使用量等等,来实现租户可用资源的管理。



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

kubectl get ns

default:所有未指定的Namespace的对象都会被分配在default命名空间。
kube-node-lease:集群节点之间的心跳维护,v1.13开始引入。
kube-public:此命名空间的资源可以被所有人访问(包括未认证用户)。
kube-system:所有由kubernetes系统创建的资源都处于这个命名空间。


  1. 下面来看Namespace资源的具体操作

    (1)查看所有的Namespace

    kubectl get ns

    (2)查看指定的ns

    kubectl get ns dev

    (3)指定输出格式, kubernetes支持的格式有很多,比如常见的wide json yaml

    kubectl get ns dev -o yaml

    (4)查看命名空间的详情

    kubectl describe namespace default

Name: default
Labels: # 标签
Annotations: # 注解
Status: Active # Active:命名空间正在使用中,Terminating:正在删除命名空间
No resource quota. # 针对namespace做的资源限制
No LimitRange resource. # 针对namespace中的每个组件做的资源限制

(5)创建命名空间

kubectl create ns dev

(6)删除命名空间

kubectl delete namespace dev

3. 命令式对象配置

(1)新建ns-dev.yaml

apiVersion: v1
kind: Namespace
metadata:
name: dev

(2)通过命令式对象配置进行创建和删除namespace

kubectl create -f ns-dev.yaml
kubectl delete -f ns-dev.yaml

Pod



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

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


  2. kubernetes在集群启动以后,集群中的各个组件也是以Pod的方式运行的,可以命令查看

    kubectl get pod -n kube-system

  3. 创建并运行Pod

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

# 命令格式 kubectl run (pod控制器名称) [参数]
# --image指定pod的镜像
# --port指定端口
# --namespace指定命名空间
kubectl run nginx --image=nginx:1.17.1 --port=80 --namespace=dev


  1. 查看pod信息

# 查看pod基本信息
kubectl get pod -n dev
# 查看pod的详细信息
kubectl describe pod pod_name -n dev


  1. 访问Pod

# 获取PodIP
kubectl get pod -n dev -o wide
# 访问pod
curl http://10.244.1.4:80


  1. 删除指定Pod

# 删除指定pod
kubectl delete pod pod_name -n dev
# 此时,显示删除pod成功,但是我们查看pod发现,又新创建了一个出来
kubectl get pod -n dev
# 这是因为当前pod是由pod控制器创建的,控制器会监控pod的状况,一旦发现Pod死亡,会立即重建
# 此时要想删除pod,必须先删除pod控制器
# 先来查询一下当前namespace下的pod控制器
`kubectl get deploy -n dev`
# 接下来删除此pod控制器
kubectl delete deployment nginx-n dev
# 稍等片刻,在查询Pod,发现Pod被删除了
kubectl get pod -n dev


  1. 命令式对象配置操作Pod

    创建一个pod-nginx.yaml文件

apiVersion: v1
kind: Pod
metadata:
name: nginx # 注意注意,这里是pod的名字,命令行没办法单独创建一个pod,需要通过pod控制器,但是yaml可以单独创建一个pod
namespace: dev
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP

然后就可以执行对应的创建和删除命令了:

# 创建
kubectl create -f pod-nginx.yml
# 删除
kubectl delete -f pod-nginx.yaml

lable



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



  2. Label的特点:

    ○ 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等。

    ○ 一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。

    ○ Label通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。

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



  3. 一些常用的Label标签示例如下:



● 版本标签:“version”:”release”,”version”:”stable”。。。
● 环境标签:“environment”:”dev”,“environment”:”test”,“environment”:”pro”。。。
● 架构标签:“tier”:”frontend”,”tier”:”backend”。。。


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

    ○ Label用于给某个资源对象定义标识。

    ○ Label Selector用于查询和筛选拥有某些标签的资源对象。

  2. 当前有两种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”的对象。

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

    ○ name=salve,env!=production。

    ○ name not in (master,slave),env!=production。

  4. 命令方式-label管理

# 为pod资源打标签
kubectl label pod nginx-pod version=1.0 -n dev
# 为pod资源更新标签
kubectl label pod nginx-pod version=2.0 -n dev --overwrite
# 查看标签
kubectl get pod -n dev --show-labels
# 筛选标签
kubectl get pod -n dev -l version=2.0 --show-labels
kubectl get pod -n dev -l version!=2.0 --show-labels
kubectl get pod -l tier=back,version=3.0 -n dev --show-labels
# 集合筛选
kubectl get pod -n dev -l "version in (3.0, 2.0)" --show-labels
# 删除标签
kubectl label pod nginx-pod version- -n dev


  1. 命令方式-label配置



  • 新建pod-nginx.yaml文件

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: dev
labels:
version: "2.0"
env: "test"
spec:
containers:
- image: nginx:1.17.1
imagePullPolicy: IfNotPresent
name: pod
ports:
- name: nginx-port
containerPort: 80
protocol: TCP


  • 执行创建和删除命令

kubectl create -f pod-nginx.yaml
kubectl delete -f pod-nginx.yaml

Deployment



  1. 在kubernetes中,pod是最小的控制单元,但是kubernetes很少直接控制pod, 一般都是通过pod控制器来完成,pod控制器用来pod的管理,确保pod符合预期的状态,当pod的资源出现故障时,会尝试重启或重新创建pod

  2. 在kubernetes中pod控制器的种类有很多,这里主要说一下Deployment


  3. 命令式对象管理deployment控制器

# 命令格式kubectl run deployment名称 [参数]
# --image 指定pod使用的镜像
# --port 指定端口
# --replicas 指定pod的数量
# --namespace 指定命名空间
kubectl run nginx --image=nginx:1.17.1 --port=80 --replicas=3 --namespace=dev
# 查看创建的Pod
kubectl get pod -n dev
# 查看deployment的信息
kubectl get deploy --namespace dev
# UP-TO-DATE成功升级的副本数量
# AVAILABLE可用的副本数量
kubectl get deploy,pod -n dev -o wide
# 查看deployment的详细信息
kubectl describe deploy nginx -n dev
# 删除delpoyment
kubectl delete deployment nginx -n dev


  1. 命令式对象配置管理deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
run: nginx
template: # 下面就是pod模板
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx:1.17.1
name: nginx
ports:
- name: nginx-port
containerPort: 80
protocol: TCP

执行创建和删除命令

kubectl create -f deploy-nginx.yaml
kubectl delete -f deploy-nginx.yaml

Service



  1. 通过上节课的学习,我们已经能利用Deployment创建一组Pod来提供高可用的服务了,虽然每个Pod都会分配一个单独的PodIP, 然而却存在如下两个问题



  • PodIP会随着pod的重建产生变化

  • PodIP仅仅是集群内可见的虚拟ip, 外部无法访问

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

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




  1. 创建集群内部可访问的Service

# 暴露Service
kubectl expose deployment nginx --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
# 查看Service
kubectl get service/svc -n dev -o wide
# 这里产生了一个Cluster-IP, 这就是service的IP, 在Service的声明周期里,这个地址是不会变化的。
# 可以通过这个ip, 访问当前Service对应的pod


  1. 创建集群外也可以访问的Service

# 上面创建的Service的type类型为ClusterIP, 这个IP地址只能集群内部访问
# 如果需要创建外部也可以访问的Service, 这个type可以改为NodePort
kubectl expose deployment nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 -n dev
# 此时查看,会发现出现了NodePort类型的Service, 而且有一对port(80:32174/TCP)
kubectl get svc -n dev -o wide
# 接下来就可以通过集群外的主机访问节点ip:32174访问服务了
# 例如在电脑主机上通过浏览器访问下面地址
192.168.10.100:32174 # 需要注意的是,此ip地址是主机的ip地址,不是service的ip地址
# 删除Service
kubectl delete service svc-nginx2 -n dev


  1. 命令式对象配置-Service

    svc-nginx.yaml文件

apiVersion: v1
kind: Service
metadata:
name: svc-nginx
namespace: dev
spec:
type: ClusterIP # type: ClusterIP写上之后,下面的clusterIP可写可不写,不写的话系统自动分配
clusterIP: 10.96.234.234 # 注意此ip一定要复合初始化集群时--service-cidr=10.96.0.0/12,在该网段下才可以,否则会报错,创建失败
ports:
- port: 8080
protocol: TCP
targetPort: 80
selector:
run: nginx

然后执行对应的创建和删除命令

kubectl create -f svc-nginx.yaml
kubectl delete -f svc-nginx.yaml

小结:至此您已经掌握了,Namespace、Pod、Deployment、Service资源的操作,有了这些操作,您可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。



推荐阅读
  • “自主设计与实施的故障注入微服务Sidecar,欢迎大佬批评指正!”
    “故障注入Sidecar“——为您的微服务注入故障以验证集群性能!由于导师和实验室师兄们的科研需要,本人专门以Sidecar的模式设计了一个用于错误注入的微服务模块。该模块可以与任 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • flutter图片缓存Flutter的图片缓存机制有问题(可能是我使用的版本1.12.13有问题)网络图片会默认缓存到本地,但是不管图片是不是完整的或者损坏的,导致页面在下次进入的 ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • KVM配置调整
    一内存CPU调整1.1增大虚拟机内存[root@k8s-01~]#virshshutdownvm01-centos7域vm01-centos7被关闭[root@k8s-01~]#v ... [详细]
  • 本文csdn博客链接:http:blog.csdn.netscrescentarticledetails51135307本文qq空间链接:http:user.qzone.qq.com ... [详细]
author-avatar
高傲的辫子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有