【kubernetes入门学习】使用kubectl在k8s上部署应用
在上一篇中,我们学习了使用minikube来搭建k8s集群。k8s集群启动后,就可以在上面部署应用了。本篇,我们就来学习如何使用kubectl在k8s上部署应用。
官方文档:Using kubectl to Create a Deployment (Hello Minikube)
一、使用kubectl部署应用
1.创建deployment
使用kubectl create命令创建一次部署,该部署用于管理Pod
kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node
查看部署
kubectl get deployments
查看pod
kubectl get pods
查看集群事件
kubectl get events
查看kubectl配置
kubectl config view
2.对外暴露服务
默认情况,pod仅能在集群内网中通过内网ip访问。如果要通过外网访问,需要将pod暴露成kubernetes服务。
1)暴露服务
1.使用kubectl expose命令将pod暴露到公网
kubectl expose deployment hello-node --type=LoadBalancer --port=8080
The --type=LoadBalancer
flag indicates that you want to expose your Service outside of the cluster.
2.查看服务
[peng@cent99 ~]$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.101.254.43 <pending> 8080:31492/TCP 3d19h kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d17h
3.查看下对外暴露的端口(NodePort选项)
[peng@cent99 ~]$ kubectl describe services/hello-node Name: hello-node Namespace: default Labels: app=hello-node Annotations: <none> Selector: app=hello-node Type: LoadBalancer IP: 10.101.254.43 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 31492/TCP Endpoints: Session Affinity: None External Traffic Policy: Cluster Events: <none>
4.
minikube service hello-node
这个我没有成功,弹出浏览器后无法访问??
2)使用标签
部署会自动为pod创建一个标签,使用describe deploymen命令可以查看标签的名称
我们用这个标签来查询pod列表
[peng@cent99 ~]$ kubectl get pods -l app=hello-node NAME READY STATUS RESTARTS AGE hello-node-55b49fb9f8-s2x8f 0/1 ImagePullBackOff 0 3d19h
同样,我们可以使用这个标签来查询service列表
[peng@cent99 ~]$ kubectl get services -l app=hello-node NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.101.254.43 <pending> 8080:31492/TCP 3d19h
使用kubectl label命令创建新标签
[peng@cent99 ~]$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') [peng@cent99 ~]$ echo Name of the Pod: $POD_NAME Name of the Pod: hello-node-55b49fb9f8-s2x8f [peng@cent99 ~]$ kubectl label pod $POD_NAME run=v1 pod/hello-node-55b49fb9f8-s2x8f labeled
使用新创建的标签来查询
[peng@cent99 ~]$ kubectl get pods -l run=v1 NAME READY STATUS RESTARTS AGE hello-node-55b49fb9f8-s2x8f 0/1 ImagePullBackOff 0 3d20h
二、kubectl的基本操作
1.查看Pod和Node的信息
- 共享的存储, 例如Volumes
- 网络, 例如唯一的集群ip地址
- 每个容器如何运行相关的一些信息,例如容器镜像的版本或者使用的唯一端口
Pod总是运行在Node中,Node可以是一台物理机,也可以是虚拟机。每个Pod都由Master管理,一个Node可以操纵多个Pod。Master会自动调度集群中跨节点的Pod,Master的自动调度会考虑每个节点上的可用资源。
每个节点都至少会运行Kubelet和容器运行时。
- Kubelet, a process responsible for communication between the Kubernetes Master and the Node; it manages the Pods and the containers running on a machine.
- A container runtime (like Docker, rkt) responsible for pulling the container image from a registry, unpacking the container, and running the application.
下面的kubectl命令可以完成大多数常用的操作:
- kubectl get - 列出资源
- kubectl describe - 显示资源详情
- kubectl logs - 打印pod中的容器的日志
- kubectl exec - 向pod中的容器执行命令
通过这些命令,我们可以查看应用何时部署,当前运行状态,运行位置,和相关的配置信息
kubectl get
查看资源对象
#查看所有pod列表
kubectl get pods
#查看rc列表
kubectl get rc
#查看service列表
kubectl get service
kubectl describe
描述资源对象详细信息
#显示node的详细信息 kubectl describe nodes [node名] #显示pod的详细信息 kubectl describe pods/[pod名] #显示由RC管理的pod的信息 kubectl describe pods [rc名]
kubectl exec
执行容器的命令
#执行pod的date命令,默认使用pod中的第1个容器执行 kubectl exec <pod名> date #指定pod中某个容器执行date命令 kubectl exec <pod名> -c <容器名> date #登录容器执行命令 kubectl exec -it <pod名> -c <容器名> /bin/bash
kubectl logs
查看容器的日志
#查看容器输出到stdout的日志 kubectl logs <pod名> #跟踪查看容器的日志,相当于tail -f命令的结果 kubectl logs -f <pod名> -c <容器名>
2.水平伸缩
【水平伸缩】 #查看部署 kubectl get deployments #查看副本集(ReplicaSet) kubectl get rs #扩容 kubectl scale deployments/kubernetes-bootcamp --replicas=4 #重新查看部署 kubectl get deployments #查看pod数是否改变 kubectl get pods -o wide #查看一下日志,输出中会有4个副本 kubectl describe deployments/kubernetes-bootcamp
3.升级应用
6.升级应用 使用 kubectl 执行滚动更新 #查看下部署 kubectl get deployments #列出正在运行的pod kubectl get pods #查看一下应用的当前镜像的版本 kubectl describe pods #版本升级到v2 kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 #重新列出正在运行的pod kubectl get pods