目录

Kubernetes in Action

1. minikube

https://minikube.sigs.k8s.io/docs/start/

# 安装 kubectl
$ curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt   # kubectl 最新版本
$ curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v1.6.4/bin/linux/amd64/kubectl
$ chmod +x kubectl
$ kubectl version

# 安装 minikube
$ wget https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ chmod +x minikube-linux-amd64
$ sudo mv minikube-linux-amd64 /usr/local/bin/minikube

首先需要配置好代理,特别注意的是,代理的地址不能是localhost127.0.0.1,保证 minikube 和它启动的 VM 内部都能够访问外网.~/.kube/config 是 Minikube 的配置文件。

minikube was unable to download gcr.io/k8s-minikube/kicbase:v0.0.15-snapshot4, but successfully downloaded kicbase/stable:v0.0.15-snapshot4 as a fallback image
This container is having trouble accessing https://k8s.gcr.io
export HTTP_PROXY="http://192.168.13.8:1081"
export HTTPS_PROXY="http://192.168.13.8:1081"
export NO_PROXY=localhost,127.0.0.1,10.96.0.0/12,192.168.99.0/24,192.168.39.0/24
$ minikube start --driver=virtualbox
$ minikube dashboard    # 开启仪表盘
$ minikube addons list     # 查看开启的插件
$ minikube stop
$ minikube delete --all # Delete all of the minikube clusters
$ minikube ssh            # 进入 master node
$ kubectl cluster-info  # 查看集群的信息
$ kubectl get node         # 查看节点
$ kubectl get ns        # 查看所有的namespace
$ kubectl get pods -A     # 获取所有的pods
$ kubectl get pods -o wide # 查看所有 pod 详情
hello-minikube-6ddfcc9757-bfmnj   1/1     Running   0   93m   172.17.0.5   minikube   <none>  <none>
$ kubectl describe pod hello-minikube-6ddfcc9757-bfmnj # 查看某个pod的详情
$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4 # 部署一个pod
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080             # 暴露到外部

Pod 的创建和删除是非常频繁的,所以不能将它直接提供给用户,所以设计了 Service(创建好后,Ip 是固定的),请求到达 Service 后,Service 确保转发给它后面的某个 Pod.

$ kubectl get service # 查看所有服务,以及访问方式
NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort       10.103.115.44    <none>        8080:31837/TCP   69m
$ minikube service hello-minikube # 获取 外部IP:Port 访问方式
| default   | hello-minikube |        8080 | http://192.168.99.102:31837 |
$ minikube service list                          # 查看所有服务,以及访问方式
| default              | hello-minikube            |         8080 | http://192.168.99.102:31837 |
# 或者通过绑定到HOST本地端口,也可以访问到 Pods
$ kubectl port-forward service/hello-minikube 7080:8080

2. Pod

Pod: 最小工作单元,每个 Pod 包含 1~N 个容器,作为一个整体被调度到一个 Node 上运行。所有容器共用一个网络 namespace,即相同的 IP 和 Port 空间,可以使用 localhost 通信,共享存储。挂载 Volume 到 Pod,等于挂载到 Pod 中每一个容器。

$ kubectl create -f kubia-manual.yaml     # 通过文件创建Pod
$ kubectl get pods --show-labels         # 列出所有Pod
$ kubectl logs -f kubia-manual -c kubia # 查看Pod的输出日志 -c 指定容器
$ kubectl port-forward kubia-manual 8888:8080 # 通过端口转发,直接映射到Pod中,方便调试
$ curl localhost:8888 # 等价于访问 PodIp:8080
$ kubectl delete pod kubia-manual # 按名称删除Pod

label 标签

$ kubectl label pod kubia-manual create_method=manual # 给Pod加上标签,--overwrite 表示覆盖原有的
$ kubectl get pod -l create_method=manual # 列出指定label=Value的Pod
$ kubectl get pod -l env    # 列出指定label的Pod
$ kubectl get pod -l '!env' # 列出没有env标签的的Pod, 语法有:env!=dev ; env in (pro,dev) ; env notin (pro,dev)
$ kubectl delete pod -l create_method=manual # 删除符合标签的Pod

namespace 命名空间

apiVersion: v1
kind: Namespace
metadata:
  name: xys-dev
$ kubectl get pod -n xys-dev # 列出指定命名空间的Pods
$ kubectl create -f custom-namespace.yaml # 通过yaml创建命名空间
$ kubectl delete ns xys-dev # 删除整个命名空间
$ kubectl delete pod --all # 删除所有容器,但保留命名空间
$ kubectl delete all --all # 删除本命名空间下的所有资源

3. Controller

$ kubectl scale rc kubia-rc-example --replicas=4 # 扩容or缩容
  • ReplicaSet : 实现了 Pod 的多副本管理,自动被 Deployment 使用,所以通常也不需要手动直接使用

  • Deployment : 管理 Pod 的多个副本

  • DaemonSet : 用于每个 Node 最多只运行一个 Pod 的场景,比如kube-proxy

  • StatefuleSet : 保证 Pod 每个副本,在整个生命周期中,名称是不变的

  • Job: 用于运行结束就删除的应用

  • Ingresses : 提供一种负载均衡方法,用于将群集外部的访问,负载到群集内部相应目的 Pod。一个外部的 Ingresses 入口可以导向许多不同的内部服务。

  • Service : 管理 Pod 的访问。定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,为 Pod 提供负载均衡

  • Namespace : 将一个物理的 Cluster 划分为逻辑上的多个 Cluster,不同的逻辑 Cluster,资源是完全隔离的

  • Secrets : 用于存储非公共信息,如令牌、证书或密码。Secrets 可以在运行时附加到 Pods,以便将敏感的配置数据可以安全地存储在集群中。

  • CronJobs:提供了一种调度 pod 执行的方法。它们非常适合定期运行备份、报告和自动化测试等任务。

  • CustomResourceDefinitions:简称 CRD 它提供了一种扩展机制,集群的操作人员和开发人员可以使用它来创建自己的资源类型。

$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/cky/.minikube/certs"
export MINIKUBE_ACTIVE_DOCKERD="minikube"

4. 服务

$ kubectl get service
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP          12h
kubia-service   ClusterIP   10.110.247.72   <none>        80/TCP,443/TCP   8h
# 在指定的Pod中执行指定的命令
$ kubectl exec kubia-rs-mzjz5 -- curl -s http://10.110.247.72
$ kubectl exec -it kubia-rs-ll75w -- bash # 在指定的Pod中运行bash
root@kubia-rs-ll75w:~# curl http://kubia-service # 访问服务

image-20210124151356430

Ingress

通过一个 IP 地址,公开所有服务。

image-20210125015634842

image-20210125020038562

「命令式」的前 Kubernetes 时代的分布式 VS 「声明式」的基于 Kubernetes 的云原生分布式

image-20210111125256735