一些概念:

1、 pods是一组容器的集合,以pods为单位来管理,共享PID,网络IP和CUTS命名空间;

2、 容器共享存储卷;用yml文件来定义容器,是k8s里的最小单位。

3、本实验要先准备好一个master,至少一个node,搭建过程略(请看本博客其它发布)。

一、实例:

示例1,一般的pods:

[root@master ~]# cat pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx

spec:

containers:

- name: nginx

image: nginx

ports:

- containerPort: 80

kubectl create -f pod.yaml  ##创建

kubectl delete pods nginx  ##删除名为nginx的pods

示例2,带自定义存储的pods:

[root@master ~]# cat vol.yaml

apiVersion: v1

kind: Pod

metadata:

name: redis

spec:

containers:

- name: redis

image: redis

volumeMounts:

- name: redis-persistent-storage

mountPath: /data/redis

volumes:

- name: redis-persistent-storage

emptyDir: {}

[root@master ~]# kubectl create -f vol.yaml

[root@master ~]# kubectl get pods redis -o yaml    ##查看在那个node创建了pods

示例3,带Labels的pods:

用于标示对象(如Pod)的key/value对,组织并选择对象子集;

[root@master ~]# cat labels.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx-labels

labels:

app: nginx-labels

spec:

containers:

- name: nginx-labels

image: nginx

ports:

- containerPort: 80

示例4,Replication Controllers:

确保在任一时刻运行指定数目的pod,容器重新调度;规模调整;在线升级,多发布版本跟踪。

[root@master ~]#  cat rc.yaml

apiVersion: v1

kind: ReplicationController

metadata:

name: nginx-controller         ##与app和labels保持一致为好,不然应用service时可能指定错。

spec:

replicas: 2

selector:

app: nginx-rc                ##依据nginx-rc来判断容器是否正常,如down掉则重新自动跑

template:

metadata:

labels:

app: nginx-rc                 ##labels为nginx-rc

spec:

containers:

- name: nginx-rc                      #容器名为nginx-rc

image: nginx

ports:

- containerPort: 80

删除后再查看:

删除整个rc后,rc就停止了:

[root@master ~]# kubectl delete rc nginx-controller

示例5,services:

Pods为另一个pods提供服务时如何找到这些pods?

Services:1、可抽象一系列pod并定义其访问规则;2、固定ip地址和DNS域名;3、通过环境变量和DNS发现服务;4、负载均衡;

5、外部服务-ClusterIP(master或nodes主机上访问) \ NodePort (提供给外部访问)\ LoadBalancer(外部访问)

[root@master ~]#  cat service.yaml     ##注意大小写

apiVersion: v1

kind: Service

metadata:

name: nginx-service

spec:

ports:

- port: 8000      ##外部访问的端口,最好要加上外部能访问的网卡ip,不然只能在node访问

targetPort: 80      # 要访问的pods端口

protocol: TCP

selector:

app: nginx-labels       #标记要访问那个 pods

创建、查看并访问:

示例6--1,rc +service (这样,能在群集以外的机器上访问NodePort类型的端口映射:且ip可以是群集的任何一个物理主机ip),本实验在示例4的基础上进行:

[root@master ~]# cat service-rc.yaml

apiVersion: v1

kind: Service

metadata:

name: nginx-service-rc

labels:

app: nginx-service-rc

spec:

type: NodePort

selector:

app: nginx-rc         ##是rc里选择器的名,不是rc实例里metadata指定的name哦

ports:

- name: http

nodePort: 30000

port: 80

protocol: TCP

访问效果:

示例6--2,rc +service 2(这样,只能在任何一台的群集机器上访问),本实验在示例4的基础上进行,与上一个实验共存,不冲突:

[root@master ~]# cat service-rc2.yaml

apiVersion: v1

kind: Service

metadata:

name: nginx-service-rc2

labels:

app: nginx-service-rc2

spec:

selector:

app: nginx-rc                ##不可以是rc文档里metadata的命名。

ports:

- port: 8033

targetPort: 80

protocol: TCP

用命令创建一个service:

kubectl create -f  service-rc2.yaml

示例7,secret:

[root@master ~]# cat secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: mysecret

type: Opaque                                  ##表示随机的用户数据。

data:  

API_KEY: bWVnYV9zZWNyZXRfa2V5

API_SECRET: cmVhbGx5X3NlY3JldF92YWx1ZTE=

或(注意大小写):

[root@master ~]# cat secret2.yaml

apiVersion: v1

kind: Secret

metadata:

name: mysecret2

type: Opaque

data:

USERNAME: root

PASSWORD: cmVhbGx5X3NlY3JldF92YWx1ZTE=

资源管理-resources ;健康检测—liveness/ readiness probes ,钩子函数:组织资源配置:

Kubectl 批量处理:在线应用升级及回退:

Track表示稳定的版本 ; replicas表示动态地调整pods的数目。

kubectl scale rc nginx-controller --replicas=5

kubectl describe pod    ##查看pod

kubectl logs pod         #查看logs

kubectl get pods -o wide       ##查所有容器的名字、ip等基本情况

docker network inspect bridge   ##查bridge的信息;

kubectl describe pods nginx-rc-9hhmb   ##查某个pods的详细信息;

kubectl port-forward nginx 8080:80   #映射某个端口到容器,以便外部机器访问(重启容器后消失)。

示例8,deployment(方便更新镜像):

[root@master ~]# cat deployment.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

labels:

app: nginx-dep

spec:

replicas: 3

selector:

matchLabels:

app: nginx-dep

template:

metadata:

labels:

app: nginx-dep

spec:

containers:

- name: nginx-dep

image: nginx:1.12.2

ports:

- containerPort: 80

############一些常用命令#################

kubectl get pods

kubectl get deployment

kubectl get rs

kubectl get deployment -o wide

##更新镜像版本,并检查升级结果:

kubectl set image deployment nginx-deployment nginx-dep=nginx:1.13

##回滚镜像并检查(版本3是最新的,覆盖了版本1):

kubectl rollout history deployment nginx-deployment

kubectl rollout undo deployment nginx-deployment

kubectl get deployment -o wide

##映射容器里的服务给外部访问:

kubectl expose deployment nginx-deployment --type=NodePort

##不需要删除原有名为nginx-deployment的 deployment

##二、网络实现(现实中,LoadbaLance使用多些):

不要直接使用管理pods,因为我们希望更新image和扩张容器时ip和port等不变,

这就要用到service:

ClusterIP: 只有master和node节点可以访问;

NodePort :外部与节点相通的网络也可以访问到。

LoadBalancer :云服务商可以提供。

Service 示例1:直接用命令映射pod给外界访问(必须要有label,容器不可以直接使用service)

kubectl expose pods nginx-labels (命令后面带 --type=NodePort 则创建的svc网络类型是NodePort,默认为ClusterIP,仅节点可访问),以下创建了一个service(pods 就是容器名为nginx-labels 的kind类型,kind类型要对,若是deployment,就要用deployment),并访问:

以下测试中,删除名为nginx-labels的pods后,service创建的ip没有变,但访问不了:

重新创建同一个配置文档下的pod, pod的ip变了,但service的ip没有变,仍可正常访问:

###另:在线用命令修改deployment文件(对应的nginx-deployment在跑),热更新:

kubectl edit deployment nginx-deployment       ##修改后保存退出后,立即生效,旧的容器会被消毁,新的容器会起来。

##其它常用命令:

kubectl get node -o wide        ##查node的情况;

kubectl describe node node1     ##查节点node1的情况;

###################         end         #########################

用实例理解k8s群集(干货)的更多相关文章

  1. 通过实例理解 RabbitMQ 的基本概念

    先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...

  2. [学习笔记]一个实例理解Lingo的灵敏性分析

    一个实例理解Lingo的灵敏性分析     线性规划问题的三个重要概念:    最优解就是反应取得最优值的决策变量所对应的向量.    最优基就是最优单纯形表的基本变量所对应的系数矩阵如果其行列式是非 ...

  3. [转帖]理解k8s 的 Ingress

    理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...

  4. Spark Job-Stage-Task实例理解

    Spark Job-Stage-Task实例理解 基于一个word count的简单例子理解Job.Stage.Task的关系,以及各自产生的方式和对并行.分区等的联系: 相关概念 Job:Job是由 ...

  5. 5分钟让你理解K8S必备架构概念,以及网络模型(上)

    写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...

  6. apply通过实例理解

    测试->运行环境chrom console >var aaa = {a:1,b:2,c:function(){console.log(this.a)}} 运行结果:undefined &g ...

  7. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  8. TensorFlow 的softmax实例理解

    对于理论,简单的去看一下百度上的说明,这里直接上实例,帮助理解. # softmax函数,将向量映射到0-1的范围内,P=exp(ax)/(sum(exp(a1x)+exp(a2x)+...)) in ...

  9. 使用生活实例理解Asp.net运行时

    学习编程语言,掌握面向对象的编程思想尤为重要,一旦理解了面向对象的这种概念,那么好些地方拿到生活中去理解,就容易的多了.书本上的枯燥干涩的语言,对于好多人来说,即难懂,更难长时间牢牢记得.但是编程语言 ...

随机推荐

  1. Clustered和Nonclustered Indexes 各自得特点和区别及长短处

    1 簇索引 簇索引对表的物理数据页中的数据按列进行排序然后再重新存储到磁盘上即簇索 引与数据是混为一体的它的叶节点中存储的是实际的数据由于簇索引对表中的数据一 一进行了排序因此用簇索引查找数据很快但由 ...

  2. VS2013 配置全局 VC++目录

    原文链接:https://blog.csdn.net/humanking7/article/details/80391914 也许是我VS2013安装的有问题,每次编译程序都要去 项目属性页-> ...

  3. 解决layui动态追加的点击事件不起作用问题

    2019独角兽企业重金招聘Python工程师标准>>> //不起作用 $('#demo').on('click', function() { layer.msg('响应点击事件'); ...

  4. Java反射详细介绍

    反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...

  5. 高性能服务器开发基础系列 (二)Reactor模式

    系列目录 第01篇 主线程与工作线程的分工 第02篇 Reactor模式 第03篇 一个服务器程序的架构介绍 第04篇 如何将socket设置为非阻塞模式 第05篇 如何编写高性能日志 第06篇 关于 ...

  6. MySQL重新初始化安装数据库

     删除./mysql/var下的所有数据后,怎么重新安装初始数据库? (1)进入./mysql/bin目录下,执行脚本./mysql_install_db: (2)执行完(1)后,此时会在./mysq ...

  7. VMware15.5.0安装MacOS10.15.0系统 安装步骤(下)

    VMware15.5.0安装MacOS10.15.0系统安装步骤(下)超详细! 接上文第5条如果没看过上篇的话传送门:https://www.cnblogs.com/Top-chen/p/128024 ...

  8. 细说 PEP 468: Preserving Keyword Argument Order

    细说 PEP 468: Preserving Keyword Argument Order Python 3.6.0 版本对字典做了优化,新的字典速度更快,占用内存更少,非常神奇.从网上找了资料来看, ...

  9. 【HBase】表模型和基本操作介绍

    目录 HBase表模型 常用Shell操作 HBase表模型 创建一个hbase表,必须要有表名和列族名 列族 -- columnFamily,就是上图中的Column Family1 userInf ...

  10. CSS实现div填充剩余高度

    相信小伙伴们经常会遇到这个问题,我也是填了很多坑,查了很多资料,才解决的,下面我列出2个方法: 我们的需求如图: 1:(这个方法不推荐使用,因为可能会因为设备不同,而出现未知BUG,特别是div出现p ...