中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84

小结大白话

Portainer 挺好的,可以GUI管理集群。可以把很多机器(节点)加到 endpoint 中做集群管理;

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

kubectl run和docker run一样,它能将一个镜像运行起来,我们使用kubectl run来将一个sonarqube的镜像启动起来。

简介

k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。那么,问题来了,要运维何用?

k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。。。

k8s的全生命周期管理

在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。

创建集群的好处就是,统一对外提供接口,无须进行各种复杂的调用;提供更好的可靠性,服务器宕机那么频繁,物理磁盘那么容易损坏,无须担心,集群统一进行调配;提供更好的性能,组合集群中各个机器的计算存储网络资源,提供更好的TPS和PS;提供横向扩容的能力,在进行横向扩容的时候,性能基本上能呈线性增长。

    在k8s里面,集群调度的最小单元就是一个pod,一个pod可以是一个容器,也可以是多个容器,例如你运行一个程序,其中使用了nginx,使用mysql了,使用了jetty,那么可以将这三个使用在同一个pod中,对他们提供统一的调配能力,一个pod只能运行在一个主机上,而一个主机上可以有多个pod。

k8s有哪些同类产品

对比Apache Mesos& Mesosphere Marathon

什么是容器调度(Description of container schedulers)?

​ 容器调度工具的主要任务就是负责在最合适的主机上启动容器,并且将它们关联起来。它必须能够通过自动的故障转移(fail-overs)来处理错误,并且当一个实例不足以处理/计算数据时,它能够扩展容器来解决问题。

对比OpenStack

​ Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。

Mac 实操k8s

K8s 入门 随笔 第1张

./kubernetes.sh

docker pull portainer/portainer # 可视化 docker

单机版运行

如果仅有一个docker宿主机,则可使用单机版运行,运行以下命令就可以启动了:

» docker run -d -p 9000:9000 \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name prtainer-test \
    portainer/portainer
1eccf4fdf585935f434221aff5ca01856e3659aa208e1fad91626c610dc9841b

本地需要加 -v /var/run/docker.sock:/var/run/docker.sock,远程的不需要
K8s 入门 随笔 第2张

账户 admin admin123

在有多台Docker的情况下,进行集群管理就十分重要了,Portainer也支持集群管理,Portainer可以和Swarm一起来进行集群管理操作,Swarm搭建参考上文。

本地情况
K8s 入门 随笔 第3张

运行K8S

下载最新的 Docker for Mac 或者 Edge 版本,即可以看到内置的 Kubernetes 集群

K8s 入门 随笔 第4张

如果我们也勾选了 Show system containers 选项,那么使用如下的 Docker 命令,能看到自动安装的 Kubernetes 相关容器

docker container ls --format "table{{.Names}}\t{{.Image }}\t{{.Command}}"

关于各个容器的作用,可以参阅 这里 : https://github.com/kubernetes/kubernetes/tree/master/build

创建 k8s 服务

» kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml

secret "kubernetes-dashboard-certs" created
serviceaccount "kubernetes-dashboard" created
role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created
deployment.apps "kubernetes-dashboard" created
service "kubernetes-dashboard" created

服务安装完毕后可以查看部署的容器与服务:

 » kubectl get services --namespace kube-system
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kube-dns               ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP   7m
kubernetes-dashboard   ClusterIP   10.106.47.35   <none>        443/TCP         20s
--- Desktop/k8s » kubectl get deployments --namespace kube-system
NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kube-dns               1         1         1            1           7m
kubernetes-dashboard   1         1         1            0           24s

在 Dashboard 启动完毕后,可以使用 kubectl 提供的 Proxy 服务来访问该面板:

$ kubectl proxy

# 打开如下地址:
# http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

K8s 入门 随笔 第5张

编辑 kubernetes-dashboard 服务
kubectl -n kube-system edit service kubernetes-dashboar

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kube-system"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
  creationTimestamp: 2019-04-04T11:26:36Z
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
  resourceVersion: "919"
  selfLink: /api/v1/namespaces/kube-system/services/kubernetes-dashboard
  uid: 8200fbdb-56cc-11e9-82da-025000000001
spec:
  clusterIP: 10.106.47.35
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

运行成功

nohup kubectl proxy --address='0.0.0.0' --port=8888 --accept-hosts='*$'

http://localhost:8888/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

k8s 集群
K8s 入门 随笔 第6张

docker 集群管理
K8s 入门 随笔 第7张

K8S 跑应用

一、Deployment的概念
K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通。
POD,是K8S中的一个逻辑概念,K8S管理的是POD,一个POD中包含多个容器,容器之间通过localhost互通。而POD需要ip地址。每个POD都有一个标签

POD–>RC–>RS–>Deployment (发展历程)

总结创建的过程:

(1)用户通过kubectl创建Deployment
(2)Deployment创建ReplicaSet
(3)ReplicaSet创建Pod

 » kubectl run net-test --image=alpine --replicas=2 sleep 36000  #创建名称为net-test的应用,镜像指定为alpine,副本数为2个
deployment.apps "net-test" created
» kubectl get pod -o wide                                                                                                                                                             127 ↵
NAME                        READY     STATUS              RESTARTS   AGE       IP          NODE
net-test-5cf9b5998c-cz8tg   0/1       ErrImagePull        0          1m        10.1.0.10   docker-for-desktop
net-test-5cf9b5998c-qqq99   0/1       ContainerCreating   0          1m        <none>      docker-for-desktop

» kubectl get deployment net-test
NAME       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
net-test   2         2         2            0           2m

kubectl get deployment 命令可以查看net-test的状态,输出显示两个副本正常运行。还可以在创建的过程中,通过kubectl describe deployment net-test了解详细的信息。

kubectl describe deployment net-test # 描述信息
kubectl describe replicaset net-test-5cf9b5998c  #查看副本集的详细信息kubectl get replicaset  #获取副本集信息

» kubectl create -f nginx-deployment.yaml                                        1 ↵
deployment.apps "nginx-deployment" created
```

kubectl get pod    #查看pod在状态,正在创建中,此时应该正在拉取镜像
kubectl describe pod nginx-deployment-6c45fc49cb-62j4d  #查看具体某个pod的状态信息

kubectl get pod -o wide  #创建成功,状态为Running

kubectl scale deployment nginx-deployment --replicas 5  #对应用的副本数进行扩容,直接指定副本数为5


### 删除 k8s 的服务
```
» kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
net-test           2         2         2            0           23m
nginx-deployment   1         1         1            1           14m
--- k8s/service » kubectl delete deployment net-test                                           130 ↵
deployment.extensions "net-test" deleted
```

### 创建 k8s 服务 java
``` shell
 » kubectl create -f webapp-rc.yaml                                               1 ↵

replicationcontroller "webapp" created
```

获取Pod的IP地址:
kubectl get pods -l app=webapp -o yaml|grep podIP
直接通过这两个Pod的IP地址和端口号访问Tomcat服务:
curl 172.17.0.2:8080

kubectl create deployment nginx --image=nginx\n
kubectl get deployments
kubectl create service nodeport nginx --tcp 80:80
kubectl get svc
curl localhost:30354
![](https://i.iamlj.com/19-04-05/001729.png)

» kubectl delete deployments/nginx services/nginx                                1 ↵
deployment.extensions "nginx" deleted
service "nginx" deleted

## 

### 其他

获取dashboard token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard-token|awk '{print $1}')|grep token:|awk '{print $2}'


node 示例
 » docker build -t shliujing/kube-node-demo1:v1 .

## Kubernetes系列之五:使用yaml文件创建service向外暴露服务

使用yaml文件创建Service(NodePort)
» kubectl create -f service.yaml
service "kube-node-service" created

![](https://i.iamlj.com/19-04-05/170933.png)

## 参考

- k8s入门(kubernetes)--持续学习更新: https://blog.csdn.net/qq_35559756/article/details/81836814
- 【可操作9分】MAC环境下Docker整合Kubernetes https://blog.csdn.net/WALK_MAN_wubiao/article/details/81351068
- 【有用】Docker(七)----搭建Portainer可视化界面
https://blog.csdn.net/u011781521/article/details/80469804
- kubernetes的dashboard登录方式
 https://www.centos.bz/2018/07/kubernetes%E7%9A%84dashboard%E7%99%BB%E5%BD%95%E6%96%B9%E5%BC%8F/
- 【有用】k8s技术预研8--深入掌握Kubernetes Service
https://blog.csdn.net/watermelonbig/article/details/79693962
- k8s部署服务——内部服务关联
 https://blog.csdn.net/u010955999/article/details/79448557
- 【已成功】Kubernetes系列之三:部署你的第一个应用程序到k8s集群
 https://blog.csdn.net/wucong60/article/details/81458409 , https://blog.csdn.net/wucong60/article/details/81586272
 
## FAQ

1. 登录不上仪表盘
![](https://i.iamlj.com/19-04-04/195605.png)
使用这个版本有跳过,1.10版本的没有跳过,可以在[这里查看版本][1]
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.8.3/src/deploy/recommended/kubernetes-dashboard.yaml

2. kube 创建的服务,ping 不通

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄