参考学习视频及教程
通过yaml文件使用镜像仓库中的镜像启动服务
(1).创建一个命名空间,形成一个独立运行环境以便隔离其他可能影响的东西
kubectl create namespace hello
(2).使用pod.yaml和svc.yaml文件启动项目,可以将内容放在同一个yaml文件里,中间用三个-隔开两部分内容,使用以下命令启动服务
kubectl apply -f xxx.yaml --namespace=xxx #有命名空间必须加
控制台显示如下示例内容即为成功!
deployment "xxx" created
service "xxx" created
(3).linux上创建个目录存放创建的pod.yaml和svc.yaml文件
创建的pod.yaml内容如下:
apiVersion: apps/v1 #指定Api版本
kind: Deployment #指定创建资源的角色/类型
metadata: #资源的元数据/属性
name: newhello #资源名,必须唯一 # 部署名字
namespace: hello
spec:
replicas: 1 #副本数量# 用来查找关联的 Pod,所有标签都匹配才行
selector: #选择器,通过它指定该控制器管理哪些pod
matchLabels: #labels匹配规则
app: newhello# 定义 Pod 相关数据
template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: newhello
spec:
nodeSelector: # 将 Pod 指定到某个节点运行
zone05: xinmei05# 定义容器,可以多个
containers:
- name: newhello #容器名
image: 10.124.129.165:5200/xxxx/newhello:latest #容器使用的docker仓库镜像地址
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8088
env:
- name: TZ
value: Asia/Shanghai
volumeMounts:
- name: ywpa-logs
mountPath: /root/ywHome/Logs #定义容器内的Volume目录
volumes:
- name: ywpa-logs
hostpath:
path: /root/ywHome2/logs #挂载的宿主机目录
(4).创建运行pod命令
kubectl create -f pod.yaml #有命名空间必须加-n 命名空间名
或
kubectl apply -f pod.yaml #有命名空间必须加-n 命名空间名
(5).查看pod状态
kubectl get pod #有命名空间必须加-n 命名空间名
或
watch kubectl get pods -o wide #有命名空间必须加-n 命名空间名
(6).查看pod运行在K8s哪个node节点
kubectl get pod -o wide #有命名空间必须加-n 命名空间名
(7).修改更新pod命令,yaml文件修改后执行更新
kubectl replace -f pod.yaml
(8).删除pod
kubectl delete pod (podName) #有命名空间必须加-n 命名空间名
或
使用yaml文件删除pod,但yaml文件照样存在,只删除pod
kubectl delete -f "xxx.yaml"
创建 Service
- Service 通过 label 关联对应的 Pod
- Servcie 生命周期不跟 Pod 绑定,不会因为 Pod 重创改变 IP
- 提供了负载均衡功能,自动转发流量到不同 Pod
- 可对集群外部提供访问端口
- 集群内部可通过服务名字访问
创建 一个 Service,通过标签test-k8s
跟对应的 Pod 关联上
(9).创建的svc.yaml内容如下:
apiVersion: v1
kind: Service
metadata:
name: newhello
spec:
selector:
app: newhello #通过此label 关联对应的 Pod
ports:
- port: 8086 #本service端口
targetPort: 8086 #容器端口
nodePort: 31446 #节点端口,端口有效范围:30000-32000
protocol: TCP #端口协议,默认tcp,支持tcp和udp# 默认 ClusterIP 集群内可访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
type: NodePort #当spec.type=NodePort时,同上,除了eureka和zuul,其他服务暂不开放
服务的默认类型是
ClusterIP
,只能在集群内部访问,我们可以进入到 Pod 里面访问:kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
对外暴露服务
上面我们是通过端口转发的方式可以在外面访问到集群里的服务,如果想要直接把集群服务暴露出来,我们可以使用
NodePort
和Loadbalancer
类型的 Service应用配置
kubectl apply -f service.yaml
在节点上,我们可以curl http://localhost:31000/hello/easydoc
访问到应用
并且是有负载均衡的,网页的信息可以看到被转发到了不同的 Pod
Loadbalancer
也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。
多端口
多端口时必须配置 name, 文档
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
name: test-k8s # 必须配置
targetPort: 8080 # 容器端口
nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767
- port: 8090
name: test-other
targetPort: 8090
nodePort: 32000
(10).创建services服务命令
kubectl apply -f xxx.yaml --namespace=xxx #有命名空间必须加-n 命名空间名
或
kubectl create -f svc.yaml #有命名空间必须加-n 命名空间名
或
kubectl expose deployment newhello --port=8086 --target-port=8086 --type=NodePort -n hello
(11).查看ervice服务
kubectl get svc #有命名空间必须加-n 命名空间名
或
kubectl get services #有命名空间必须加-n 命名空间名
(12).yaml从dockerhub上拉下来镜像
1.进入pod容器
kubectl exec -it (podName) /bin/sh #有命名空间必须加-n 命名空间名
或
kubectl exec -it (podName) #有命名空间必须加-n 命名空间名 sh
或
-c container-name 可以指定进入哪个容器。
kubectl exec -it pod-name -- bash
2.退出容器
exit
3.测试自定义接口:
curl "http://localhost:8088/demo/he"
(13).删除pod
kubectl delete pod hello-52bf9aa77a5c #有命名空间必须加-n 命名空间名
# 查看 deployment
kubectl get deployment
# 查看 pod 详情
kubectl describe pod pod-name
# 查看 log
kubectl logs pod-name
# 伸缩扩展副本
kubectl scale deployment test-k8s --replicas=5
# 把集群内端口映射到节点
kubectl port-forward pod-name 8090:8080
# 查看历史
kubectl rollout history deployment test-k8s
# 回到上个版本
kubectl rollout undo deployment test-k8s
# 回到指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
# 删除部署
kubectl delete deployment test-k8s
# 查看全部
kubectl get all
# 重新部署
kubectl rollout restart deployment test-k8s
# 命令修改镜像,--record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s
# 恢复
kubectl rollout resume deployment test-k8s
# 输出到文件
kubectl get deployment test-k8s -o yaml >> app2.yaml
# 删除全部资源
kubectl delete all --all