用实例理解k8s群集(干货)
一些概念:
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群集(干货)的更多相关文章
- 通过实例理解 RabbitMQ 的基本概念
先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...
- [学习笔记]一个实例理解Lingo的灵敏性分析
一个实例理解Lingo的灵敏性分析 线性规划问题的三个重要概念: 最优解就是反应取得最优值的决策变量所对应的向量. 最优基就是最优单纯形表的基本变量所对应的系数矩阵如果其行列式是非 ...
- [转帖]理解k8s 的 Ingress
理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...
- Spark Job-Stage-Task实例理解
Spark Job-Stage-Task实例理解 基于一个word count的简单例子理解Job.Stage.Task的关系,以及各自产生的方式和对并行.分区等的联系: 相关概念 Job:Job是由 ...
- 5分钟让你理解K8S必备架构概念,以及网络模型(上)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- apply通过实例理解
测试->运行环境chrom console >var aaa = {a:1,b:2,c:function(){console.log(this.a)}} 运行结果:undefined &g ...
- Kubernetes系列之理解K8s Service的几种模式
今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...
- TensorFlow 的softmax实例理解
对于理论,简单的去看一下百度上的说明,这里直接上实例,帮助理解. # softmax函数,将向量映射到0-1的范围内,P=exp(ax)/(sum(exp(a1x)+exp(a2x)+...)) in ...
- 使用生活实例理解Asp.net运行时
学习编程语言,掌握面向对象的编程思想尤为重要,一旦理解了面向对象的这种概念,那么好些地方拿到生活中去理解,就容易的多了.书本上的枯燥干涩的语言,对于好多人来说,即难懂,更难长时间牢牢记得.但是编程语言 ...
随机推荐
- Samba远程Shell命令注入执行漏洞
CVE:CVE-2007-2447 原理: Samba中负责在SAM数据库更新用户口令的代码未经过滤便将用户输入传输给了/bin/sh.如果在调用smb.conf中定义的外部脚本时,通过对/bin/s ...
- java学习(第三篇)String类
一.创建一个字符串 1.String(char a[]):用一个字符数组a创建一个string类型 char a[]= {'h','e','l','l','o'}; String s=new Stri ...
- 模糊c-means算法的c++实现
首先输入点的个数,维度,分类数目 我的代码FCM中主要过程如下: 1:(init_c函数)随机初始化聚类中心 2:(comp_dis函数)计算每个点到每个聚类距离 dis[i][j] 表示i点到j聚类 ...
- 【Linux题目】第四关
1. 如何过滤出已知当前目录下oldboy中的所有一级目录? 提示:不包含oldboy目录下面目录的子目录和隐藏目录,只要一级目录即可. 解答: ls -F|grep / 通过ls -F给目录后面 ...
- 以内存级速度实现存储?XPoint正是我们的计划
随着计算能力虚拟化技术的普及,存储机制在速度上远逊于内存这一劣势开始变得愈发凸显. 这一巨大的访问速度鸿沟一直是各项存储技术想要解决的核心难题:纸带.磁带.磁盘驱动器乃至闪存记忆体等等,而如今最新一代 ...
- nginx 反向代理转发导致css,js,图片失效
为什么80%的码农都做不了架构师?>>> 需要添加以下配置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { proxy_pass htt ...
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...
- 曹工谈并发:Synchronized升级为重量级锁后,靠什么 API 来阻塞自己
背景 因为想知道java中的关键字,对应的操作系统级别的api是啥,本来打算整理几个我知道的出来,但是,尴尬的是,我发现java里最重要的synchronized关键字,我就不知道它对应的api是什么 ...
- P1495 CRT,P4777 EXCRT
updata on 2020.4.11 修正了 excrt 的一处笔误 CRT 求解方程: \[\begin{cases} x \equiv a_1 \pmod {m_1}\\ x \equiv a_ ...
- GitHub 热点速览 Vol.18:刷 LeetCode 的正确姿势
作者:HelloGitHub-小鱼干 摘要:找对路子,事半功倍,正如本周 GitHub Trending #刷 LeetCode# 主题想表达的那般,正确的学习姿势方能让人走得更远,走进大厂