一些概念:

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. 安卓微信浏览器中window.location.href失效的问题

    最近接手一微信项目,测试功能时,发现跳转在android手机上不动了.iso系统可以正常跳转的.解决方法: window.location.href = url + '?v=' + (new Date ...

  2. redis5.0.3配置文件详解

    Redis最新版本5.0.3配置文件详解 单位 #当你需要为某个配置项指定内存大小的时候,必须要带上单位, #通常的格式就是 1k 5gb 4m 等: #1k => 1000 bytes #1k ...

  3. Spring5参考指南: SpEL

    文章目录 Bean定义中的使用 求值 支持的功能 函数 Bean引用 If-Then-Else Elvis Safe Navigation 运算符 集合选择 集合投影 表达式模板化 SpEL的全称叫做 ...

  4. oracle查询当前系统时间前10天的数据

    select * from eo_c_order t where t.create_time>systimestamp-interval'1'day; 转载于:https://www.cnblo ...

  5. 单源最短路径(3):SPFA 算法

    SPFA(Shortest Path Faster Algorithm)算法,是西南交通大学段凡丁于 1994 年发表的,其在 Bellman-ford 算法的基础上加上一个队列优化,减少了冗余的松弛 ...

  6. P3842 [TJOI2007]线段

    最近多刷些dp,觉得这个算不上蓝题   在一个\(n\times n\)的平面上,在每一行中有一条线段,第\(i\)行的线段的左端点是\((i, L_i)\),右端点是\((i, R_i)\),其中\ ...

  7. Jenkins 项目构建

    一:新建项目 (1)点击新建,输入项目名称--构建一个自由风格的软件项目,点击ok (2)构建触发器-----设置每两分钟执行一次 其中有5个参数 (*****) 第一个是代表分钟  一小时内的分钟数 ...

  8. python基础入门教程(一条龙服务)

    一.语言基础 01-1 计算机系统 解释器下载 变量   小整数池 01-2 垃圾回收机制 02 数据类型 运算符(解压赋值等) 03 流程控制 if while for 04 整形 字符串 列表 0 ...

  9. gVim配置文件分享

    前言 直接可以把这个配置覆盖掉现在安装目录Vim底下的"_vimrc"文件 效果图 Code: set number set tabstop=4 set softtabstop=4 ...

  10. nginx判定国家ip访问网站

    我们可以通过GeoIP模块和MaxMind免费数据库来实现.MaxMind具有新版本的数据库GeoLite2,它仅支持CSV和mmdb格式.可以支持mngx_http_geoip2_modulemdb ...