下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
// An highlighted block
kubectl get nodes //列出集群节点
kubectl describe node 节点名称 //查看指定对象更多信息
kubectl describe node //查看所有对象信息
kubectl run 应用名称 --image=luksa/kubia --port=8080 --generator=run/vl //部署应用
//--image=luksa/kubia 指定要运行的容器镜像
//--port=8080 kubernetes 应用正在监昕 8080 端口
//--generator=run/vl 通常并不会使用到它,它让 Kubemetes 创建 ReplicationController, 而不是Deployment。
kubectl expose pod名称 --type="NodePort" --port 8080 //将容器的8080端口映射到节点端口
kubectl expose rc pod名称 --type=LoadBalancer --name 服务名称 //创建服务暴露pod,外部可以访问
kubectl cluster-info //集群信息
kubectl delete po pod1 pod2 //删除多个pod
kubectl delete po -l 标签名=标签值 //使用标签选择器删除pod
kubectl delete ns 命名空间 //通过删除命名空间删除pod
kubectl delete po --all //删除当前命名空间中所有的pod
kubectl delete all --all //删除命名空间中的几乎所有资源
滚动更新
kubectl set image pod名 kubernetes-bootcamp=新版镜像:<tag> #将应用使用的镜像版本升级
kubectl rollout undo pod名 #应用容器使用镜像版本回退
创建别名:在~/.bashrc或类似文件中添加
alias k=kubectl
重要概念
-
cluster:计算、存储和网络资源的集合
-
master:cluster的大脑,主要职责是调度,决定应用放在哪里运行
-
node:运行容器应用,node由master管理
-
pod:是k8s的最小工作单元,每个pod包含一个或多个容器,pod中的容器会作为一个整体被master调度到一个node上运行。pod中的所有容器使用同一个网络namespace,即相同的IP地址和port空间。
-
controller:k8s不直接创建pod,而是通过controller来管理pod。controller包括Deployment、Replicate、DaemonSet、StatefuleSet、Job等
(kubectl get 控制器类型)
1)Deployment:最常用,可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
2)ReplicaSet:实现了Pod的多副本管理。使用Deployment时会自动创建ReplicaSet,也就是说Deployment是通过ReplicaSet来管理Pod的多个副本的,我们通常不需要直接使用ReplicaSet。
3)DaemonSet:用于每个Node最多只运行一个Pod副本的场景,通常用于运行daemon
4)StatefuleSet:能够保证Pod的每个副本在整个生命周期中名称 是不变的
5)Job:用于运行结束就删除的应用,而其他Controller中的Pod 通常是长期持续运行。 -
service:Service定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。
-
namespace:可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同Namespace里的资源是完全隔离的。
Kubernetes默认创建了两个Namespace,
-
default:创建资源时如果不指定,将被放到这个Namespace中。
-
kube-system:Kubernetes自己创建的系统资源将放到这个 Namespace中。
pod
一个pod是一组紧密相关的容器,它们运行在同一个工作节点上,以及同一个Linux命名空间中。每一个pod都有自己的IP,并包含一个或多个容器,每个容器都运行一个应用进程。pod分布在不同的工作节点上。
kubectl get pods #列出pod
kubectl get pods -o wide #显示pod的IP和所运行的节点
kubectl describe pod #查看所有pod更多信息,和node类似
kubectl describe pod pod名称 #查看指定pod更多信息,和node类似
访问web应用
每个pod都有自己的ip地址,但是地址是集群内部的,不能从集群外部访问,为了让pod可以从外部访问,需要创建一个特殊的LoadBalancer类型服务,将创建一个外部的负载均衡,通过负载均衡的公共IP访问pod
- 创建一个服务对象
kubectl expose rc 应用名称 --type=LoadBalancer --name 服务名称
- 列出服务
kubectl get services 或 kubectl get svc
- 使用外部IP访问服务
curl 地址:端口号
扩容
kubectl scale 控制器类型 应用名称 --replicas=3 #增加或减少pod副本数为3
kubectl get 控制器类型 #查看扩容效果
扩容之后,应用的多个实例在运行,当请求服务时,服务作为负载均衡挡在多个pod前面,请求会随机切换不同的pod,无论服务后面是单个pod还是一组pod,这些pod的IP地址会发生改变,但是服务地址总是相同。
通过pod合理管理容器
- 将多层应用分散到多个pod中
- 基于扩缩容考虑而分割到多个pod中
YAML或JSON描述文件创建pod
kubectl get pod pod名称 -o yaml #获取指定pod的YAML描述文件
kubectl get pod pod名称 -o json #获取指定pod的YAML描述文件
kubectl explain pods #查看pod支持哪些属性
kubectl explain pod.spec #查看spec属性
kubectl create -f yaml文件名 #从YAML文件创建pod
kubectl logs pod名称 -c 容器名称 #查看日志
kubectl port-forward pod名称 本机端口:pod端口 #本地端口映射
一个基本的pod yaml描述文件
apiVersion:v1
kid:Pod
metadata:
name:pod名称
labels:
key:value #标签键值对
spec:
nodeSelector:
标签名:value #节点选择器要求k8s只将pod部署到包含改标签的节点上
container:
- image:创建容器所用镜像
name:容器名称
livenessProbe: #一个http get存活探针
httpGet:
path: / #http请求路径
port: #探针连接的网络端口
ports:
- containerPort:应用监听端口
protocal:TCP
向pod发送请求
不通过service的情况下,可以通过配置本地端口转发到pod,就可以通过本地端口连接pod
kubectl port-forward pod名称 本地端口:pod端口
标签
标签是一种k8s特性,不仅可以组织pod,还可以组织所有其他的k8s资源。标签可以附加到资源的任意键值对,只要标签的key唯一,一个资源可以拥有多个标签。创建pod时指定标签。
kubectl get pods --show-labels #查看所有pod的标签
kubectl get pods -L 标签名,标签名 #查看pod指定标签值
kubectl get pods -l 标签名=标签内容 #通过标签名筛选pod
#标签名 in (value1,value2,..)
#标签名 notin (value1,value2,..)
#标签名 != 标签值
#'!标签名' 不包含该标签
kubectl get pods -l 标签名 #筛选包含标签名的pod
kubectl label pods pod名 标签名=标签内容 #添加标签
kubectl label pods pod名 标签名=标签内容 --overwrite #修改指定标签
kubectl label nodes 节点名 标签名=标签内容 #节点添加标签
kubectl get nodes -l 标签名=标签内容 #筛选包含指定标签且值相等
注解
- 注解也是键值对,本质与标签类似,但不是为了保存标识信息而存在
- 注解可以容纳更多的信息,并且主要用于工具使用
kubectl annotate pod pod名称 注解名=注解值 #添加注解
命名空间
kubectl get ns #查看命名空间
kubectl get po --namespace 命名空间 #查看属于该命名空间的pod
kubectl create -f yaml文件名 -n 命名空间名 #创建资源时指定命名空间
创建命名空间方法
- yaml文件
#定义命名空间yaml文件
apiVersion:v1
kind:Namespace
metadata:
name:命名空间名称
#创建命名空间
kubeclt create -f 命名空间yaml文件名
- 命令直接创建
kubectl create namespace 命名空间名称