k8s学习笔记

简介

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
使用Kubernetes可以:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它,等等…

Minikube

为了方便大家开发和体验Kubernetes,社区提供了可以在本地部署的Minikube
Minikube可以实现一种轻量级的Kubernetes集群,通过在本地计算机上创建虚拟机并部署只包含单个节点的简单集群。

minikube version
minikube start

概念

Pod

有独立的ip
我的理解是节点是固定的,pod可以动态增加

如果一些容器属于强耦合并且需要共享资源(例如 磁盘),那么这些容器应该放到单个 Pod 中一起调度。

工作集群

一个Kubernets工作集群至少有三个节点

20190130154881987899911.png

Master

集群的调度节点。master协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新

Node

Node 是应用程序实际的工作节点,可以是虚拟机或物理机。每个工作结点都有一个Kubelet,它是管理节点并与Kubenets Master节点进行通信的代理。具体来讲它是Kubernetes Master 和 所有节点之间通信的进程,负责管理机器上运行的 Pod 和容器。容器运行时(例如 Docker, rkt) 负责从镜像仓库中拉取容器镜像,解包容器并运行应用程序。
20180811153398862892553.png

Deployment

Service

Kubernetes 中的服务是一个抽象对象,它定义了一组逻辑的 Pods 和一个访问它们的策略。
pod之间的发现和路由都是k8s service处理的
服务使用 标签和选择器,匹配一组 Pod

类型

ClusterIP(默认) - 在集群中的内部IP上公开服务。此类型使服务只能从集群中访问。
NodePort —— 使用NAT在群集中每个选定的节点的同一端口上显示该服务。使用 :可以从群集外部访问服务。建立 ClusterIP 的超集。
LoadBalancer —— 在当前云中创建外部负载平衡器(如果支持),并为服务分配固定的外部IP。建立 NodePort 的超集。
ExternalName —— 使用任意名称显示该服务(由规范中的externalName 指定),本过程通过使用该名称返回 CNAME 记录达成。无须使用代理。这种类型需要 v1.7 或更高版本的 kube-dns

标签

kubectl get pods -l environment=production,tier=frontend
kubectl get pods -l ‘environment in (production),tier in (frontend)’
kubectl get pods -l ‘environment’ //表示有environment标签

,表示AND

滚动更新

将应用程序从一个环境升级到另一个环境 (通过容器镜像更新)
回滚到以前的版本
持续集成和持续交付,实现应用程序零停机

应用伸缩

Scaling 是通过更改 Deployment 中的副本数量实现的

port/nodePort/TargetPort

port (pod上的端口)
集群内部使用的端口 Service IP +Port
nodePort (对外端口)
k8s集群提供给外部客户端访问service使用的端口,一般是主机IP:nodePort就可以访问到该服务
TargetPort (对内端口)
pod中容器的暴露的端口,例如docker expose的端口 Service IP+Port
从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

service的CLUSTER IP,其实就是一个VIP
nodePort的工作原理与clusterIP大致相同,是发送到node上指定端口的数据,通过iptables重定向到kube-proxy对应的端口上。然后由kube-proxy进一步把数据发送到其中的一个pod上。

helm

https://medium.com/@evenchange4/%E4%BA%94%E5%88%86%E9%90%98-kubernetes-%E6%9C%89%E6%84%9F-e51f093cb10b
http://dockone.io/article/932

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
kubectl get - 列出可用资源
kubectl delete - 删除资源
kubectl describe - 显示有关资源的详细信息
kubectl logs - 从 Pod 中的容器打印日志
kubectl exec - 在 Pod 中的容器执行命令
kubectl proxy - pods是在一个私有隔离的网络中的,默认情况下只能访问主动暴露的服务。通过kubecel proxy可以不暴露服务直接访问私有网络中的内容
kubectl cluster-info - 查看集群详情
kubectl get nodes - 查看集群的node
kubectl get deployments - 获取所有部署信息
sudo kubectl run medium-api --image=evenchange4/micro-medium-api:latest --port=3000 //--port表示容器对外的端口
kubectl expose deployment medium-api --type=LoadBalancer //--expose 在 kubectl 中创建部署的同时创建服务。
kubectl get pods -o wide
kubectl get deployment
kubectl get service
kubectl get nodes
# 端口转发
kubectl port-forward $POD_NAME 3307:3306
MYSQL_ROOT_PASSWORD=$(sudo kubectl get secret --namespace default womping-ragdoll-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
# scale
kubectl scale deployment/medium-api --replicas=2 //动态扩容
sudo kubectl set image deployments/medium-api medium-api=evenchange4/micro-medium-api:2.1.0 //滚动更新
kubectl rollout status deployments/medium-api
kubectl rollout undo deployments/medium-api //撤销滚动更新
# 标签
kubectl label pod <pod_name> app=v1
kubectl delete service -l run=kubernets-bootcamp 删除标签run值为kubernets-bootcamp的服务