kubenetes创建一个pod应用
Pod是可以创建和管理Kubernetes计算的最小可部署单元。pod可以理解为容器的外壳,给容器做了一层抽象封装。一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),这多个容器间共享IPC、Network和UTC,和存储卷,存储卷不再属于容器,而属于pod。
Pod分为两类:
- 自主式Pod
- 控制器管理的Pod
- ReplicationController
- ReplicaSet
- Deployment 管理无状态的
- StatefulSet 管理有状态的
- Job, Ctonjob
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
创建一个pod应用
kubectl run -h 查看run命令的用法
master01 # kubectl run nginx-deploy --image=nginx:1.14-alpine --port= --replicas=1 --record
控制器名称 容器镜像 容器的端口 pod的数量 在Deployment revision中可以查看到执行的历史命令
查看
# kubectl get deployment -o wide #查看deployment控制器
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy 1/1 1 1 2m38s nginx-deploy nginx:1.14-alpine run=nginx-deploy
[master01 ]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-55d8d67cf-kckf9 / Running 2m55s 10.244.1.2 node01 <none> <none>
可以看到pod已经运行在一个工作节点上, 这里的ip是cni0桥的ip
[node01] # ifconfig
cni0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 10.244.1.1 netmask 255.255.255.0 broadcast 0.0.0.0
# curl 10.244.1.2 可以访问到nginx。在集群中间的任意一个节点都可以访问到pod
在集群内部任意的节点可以访问pod 。集群外部无法直接访问pod
删除pods 查看会看到自动起来另一个,因为 replicas个数为1,控制器会另外再启动一个pod
# kubectl delete pod nginx-deploy-55d8d67cf-kckf9
pod "nginx-deploy-55d8d67cf-kckf9" deleted
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-55d8d67cf-lf5xb / Running 2m55s 10.244.1.3 node01 <none> <none>
会看到容器已经被重建了,且pod的ip发生变化了。
service
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。
举个例子:a服务运行3个pod,b服务怎么访问a服务的pod,pod的ip都不是持久化的重启之后就会有变化。
这时候b服务可以访问跟a服务绑定的service,service信息是固定的提前告诉b就行了,service通过Label Selector跟a服务的pod绑定,无论a的pod如何变化对b来说都是透明的。
客户端的请求到service,由service代理至后端的pod。service并不是一个具体的应用程序,而是相当于一条ipvs或iptables规则。
kubectl expose -h 查看命令的用法
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
创建service
# kubectl expose deployment nginx-deploy --name=nginx80 --port=80 --target-port= --protocol=TCP
service_name service_port pod_port
service/nginx exposed
查看service
# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> /TCP 26d <none>
nginx80 ClusterIP 10.105.125.134 <none> /TCP 118s run=nginx-deploy
# curl 10.105.125.134:80 在集群内部节点上可以访问到pod
在集群节点可以使用 service_ip:service_port 访问pod。 node访问 -> service_ip:service_port -> pod_ip:pod:port。
在pod客户端可以通过 service_name:service_ip 访问到pod,这依赖于coredns解析
[master01 ] # cat /etc/resolv.conf
nameserver 114.114.114.114 # 节点上的dns服务器不是指向的coredns的地址,所以无法直接通过server_name:service_ip 访问pod
# kubectl get svc -n kube-system #可以看到coredns的地址
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 6d3h
在pod客户端访问
# kubectl run client --image=busybox --replicas=1 -it --restart=Never
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
\# wget -O - -q http://nginx80 可以访问到 # pod客户端可以通过 server_name:server_ip 访问到pod
kubectl describe svc nginx80 查看service详细信息
- selector 标签选择器
- endpoints可以看到后端pod资源
pod被删除掉之后会创建一个新pod,访问nginx:80依然能访问到,因为service通过selector标签选择器跟pod建立了绑定,service可以为pod提供固定访问端点。
# kubectl get pods --show-labels # 查看标签
NAME READY STATUS RESTARTS AGE LABELS
client 1/1 Running 0 19m run=client
nginx-deploy-54d6d94f75-b2kxf 1/1 Running 0 165m pod-template-hash=54d6d94f75,run=nginx-deploy
实践:
创建两个pod
# kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2
# kubectl get deployment -w # -w 监控deployment状态
# kubectl get pods -o wide
创建一个service
# kubectl expose deployment myapp --port=8000 --target-port=80
查看svc
# kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: run=myapp
Annotations: <none>
Selector: run=myapp
Type: ClusterIP
IP: 10.99.71.37
Port: <unset> 8000/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.35:80,10.244.1.36:80 #service后端的两个pod
Session Affinity: None
Events: <none>
创建一个pod客户端访问 service_name:service_port,可以看到service是随机的将请求分发到后端的两个pod的
# kubectl run client --image=busybox -it
/ # wget -O - -q http://myapp:8000/hostname.html
动态扩容缩容
kubectl scale --replicas=5 deployment nginx-deploy # replicas指定pod数即可扩容缩容
升级镜像
将镜像升级为1.16-alpine:
# kubectl set image deployment nginx-deploy nginx-deploy=nginx:1.16-alpine --record
deployment.extensions/nginx-deploy image updated
另开一个窗口监控升级过程:
# kubectl get pod -w
升级完成后查看:
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-56457775df-ptx9f / Running 2m25s
# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deploy / 23d nginx-deploy nginx:1.16-alpine run=nginx-deploy
# kubectl describe pod nginx-deploy-56457775df-ptx9f
回滚操作
# kubectl rollout undo deployment/nginx-deploy
deployment.extensions/nginx-deploy rolled back
--to-revision 参数可以指定回退的版本
# kubectl rollout undo deploy/nginx-deploy --to-revision=1
# kubectl rollout history deployment/nginx-deploy #查看历史版本
这里CHANGE-CAUSE显示为空是因为操作deployment的时候没有加--record。如果加上应该显示:
外部客户端访问pod
k8s中的三种网络:
Node Network: 与外部网络接口
Service Network:又叫集群网络,与pod不在一个网段,只存在于iptables或ipvs规则中,是虚拟的
Pod Network: 节点当中pod的内部网络,可以ping通
如果端口暴露类型为NodePort,那么外部客户端可以通过集群内任意一台主机ip加暴露的端口进行访问
1. # kubectl edit svc myapp 修改service的type为NodePort
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
2. 也可以在创建service时指定type
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --
type
=NodePort
# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d <none>
nginx80 NodePort 10.105.125.134 <none> 80:32441/TCP 35m run=nginx-deploy
使用集群外客户端访问,需要使用集群任意一个节点的IP地址加上暴露的端口号
kubenetes创建一个pod应用的更多相关文章
- 3.创建一个pod应用
创建一个应用:k8s增删查改: pod创建:kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 [roo ...
- ADF_General JSF系列1_创建一个简单的JSF Application
2015-02-17 Creatd By BaoXinjian
- Docker Kubernetes 创建管理 Pod
Docker Kubernetes 容器扩容与缩容 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...
- K8S学习笔记之二进制的方式创建一个Kubernetes集群
0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...
- 创建 个人 pod
创建一个自己的 pod 大致需要以下步骤 创建git repository 编辑.podspec 创建LICENSE(许可证/授权)文件 标记 tag 验证 注册CocoaPods 发布 搜索验证 1 ...
- 如何在Kubernetes里创建一个Nginx service
Jerry之前的文章如何在Kubernetes里创建一个Nginx应用,已经使用kubectl命令行创建了Pod,但是在kubernetes中,Pod的IP地址会随着Pod的重启而变化,因此用Pod的 ...
- 如何在Kubernetes里创建一个Nginx应用
使用命令行kubectl run --image=nginx nginx-app --port=80 创建一个名为nginx-app的应用 结果: deployment.apps/nginx-app ...
- [Swift通天遁地]二、表格表单-(9)快速创建一个美观强大的表单
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- k8s集群启动了上万个容器(一个pod里放上百个容器,起百个pod就模拟出上万个容器)服务器超时,无法操作的解决办法
问题说明: 一个POD里放了百个容器,然后让K8S集群部署上百个POD,得到可运行上万个容器的实验目的. 实验环境:3台DELL裸机服务器,16核+64G,硬盘容量忽略吧,上T了,肯定够. 1.一开始 ...
随机推荐
- SpringBoot自动配置的魔法是怎么实现的
SpringBoot 最重要的功能就是自动配置,帮我们省去繁琐重复地配置工作.相信用过SpringBoot的人,都会被它简洁的步骤所惊讶.那么 SpringBoot 是如何实现自动配置的呢? 在这之前 ...
- Java原子类--框架
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicIn ...
- 7月新的开始 - Axure学习06 - 母版的使用
母版的使用 主导航.底部.在很多页面上都是一样的: 如果在每一个页面都写一次的化.话.是非常浪费时间的,为了方便.可以使用母版: 母版可以帮助我们将一些元素重复利用,既可以保证页面的统一性.还可以节省 ...
- h5css3弹性盒子
弹性盒子: 老:display:box: 新:display:flex: 方向:flex-direction: 横向正方向 row/横向反方向 row-reverse/纵向正方向 column/纵向反 ...
- HR#7 题解
T1 签到题 #include<bits/stdc++.h> #define R register int using namespace std; inline int g() { R ...
- 剖析生产系统的I/O模式
剖析生产系统的I/O模式 2019/02/13 vmunix 了解I/O的特点对于优化系统性能非常重要,I/O是顺序的还是随机的,是读操作还是写操作,读写的比例是多少,I/O数据块的大小,这些都是影响 ...
- jquery验证时间
http://blog.csdn.net/guguojin/article/details/7045908 验证时间的正则表达式集合 //日期格式yyyy PatternsDict.date_y= ...
- NetworkX系列教程(10)-算法之二:最小/大生成树问题
小书匠 Graph 图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...
- Python基础之给函数增加元信息
1. 参数注解 当写好一个函数以后,想为这个函数的参数添加一些额外的信息,这样的话,其他的使用者就可以清楚的知道这个函数应该怎么使用,这个时候可以使用函数参数注解. 函数参数注解能提示程序员应该怎样正 ...
- Java基础系列 - 泛型和反射机制
package com.test5; import java.lang.reflect.Field; import java.lang.reflect.Method; /** * Java泛型和反射机 ...