当前位置:   article > 正文

docker和kubernetes简单使用手记_手动在服务上启动的docker,在kubesphere上看得到吗

手动在服务上启动的docker,在kubesphere上看得到吗

1,前言

最经很多加班,所以没时间写博客,说的我好像有时间就会写博客一样~~,做下知识输出吧,关于docker和kubernetes的。

2,关于docker

关于docker,我有一篇简单的博文,大家可以参考一下我之前写的,虽然恨水,但是入门就行。今天主要是介绍一下kubernetes的,简称k8s,这个是google出的一个服务治理,编排的工具,可以轻松实现springboot中的服务治理,注册发现等逻辑。

3,关于kebernetes

下面介绍一下k8s和docker的关系,他俩的关系就是一个是容器,一个是容器的外围。也就是docker是跑我们具体的业务逻辑的,比如我们把自己的jar包,写个dockerfile,打成镜像,用docker跑起来。k8s是管理这些跑起来的服务的外围工具,比如要做集群,那就开启一个replicaset,如果资源不够,可以把集群的机器减少数量,最大的特性在于,可以把处于不同的物理机器(k8s中称为nodes)上的服务编排为一组或者多组服务,通过namespace声明不同的空间,这些不同的空间,就构成了一组独立的服务,当然了跨namespace也是可以资源共享的,然后这组服务内部的nodes就会不断的通信以达到同步的目的。

4,踩坑记录

首先我们需要一台安装了kubernetes的linux机器。大家可以尝试在ubuntu上安装microk8s,这个是ubuntu推荐的单主机时的解决方案,https://ubuntu.com/kubernetes/install#single-node,大家可以上去瞄一瞄。

4.1,需要启动dns,命令:microk8s.enable dns,否则报错信息:

Warning  MissingClusterDNS       21s (x5 over 3m13s)  kubelet, naison-tm1701  pod: "nginx-deployment-7b8fddc8f6-hg28v_my-zone(3b9d9cd6-dc22-4a1f-b369-364208e78447)". kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy.

4.2,solution:暂无。报错信息:

Warning  FailedCreatePodSandBox  33s (x4 over 2m43s)  kubelet, naison-tm1701  Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to pull and unpack image "k8s.gcr.io/pause:3.1": failed to resolve reference "k8s.gcr.io/pause:3.1": failed to do request: Head "https://k8s.gcr.io/v2/pause/manifests/3.1": dial tcp 64.233.188.82:443: i/o timeout

说是拉取镜像k8s.gcr.io/pause:3.1失败。原因是看起来很简单,被长城给墙了。网上的解决方案为:从mirrorgooglecontainers的仓拉取,docker tag一下,但是我尝试了多次,还是不行,shit。

  1. naison@naison-TM1701:~/Desktop$ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. k8s.gcr.io/pause 3.1 da86e6ba6ca1 2 years ago 742kB
  4. mirrorgooglecontainers/pause 3.1 da86e6ba6ca1 2 years ago 742kB

所以我的实验数据没法儿展示。

4.3,补充:建议还是使用vmware workstation安装centos,再安装kubernetes和docker,具体可以参考:

https://blog.51cto.com/douya/1945382

https://linuxacademy.com/community/show/15747-error-creating-kubernetes-pod-no-api-token-found-for-service-acc/

这两篇博客

5,基本概念

虽然没法儿看实验数据,但是该说的还的说。(现在就可以补图了)

5.1,大体概念需要了解,k8s中的资源都是可以定义的,通过yaml文件定义。

5.2,pods是最小的容器,也就是我们的业务在pods里边。

deployment:是管理容器的控制器,可以管理这一组pods的状态。

service:是提供一组服务的入口,可以看成是网关或者负载均衡,通过service对外提供服务,对内将请求打到pods上。

ingress:是对外网提供服务的入口,这里可以配置域名。也就是外网 --> ingress --> service --> pods

selector:是标签选择器,维护关系使用,常用在service和pods这一组关系中。

endpoint:是端点,可以手动指定将某一个pods链接到service上

namespace:是命令空间,也就是资源隔离使用的。多个物理机(nodes)可以通过逻辑概念namespace划分不同的服务。

6,常见yaml

这里我会列出四个常用的资源yaml,这四个yaml就完整的定义了从公网到服务端的一个完整链路。即:

公网 --> ingress --> service --> pods。

6.1,nginx-namespace.yaml,作用是创建一个namespace

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: my-zone

6.2,创建使用控制器deployment创建pods,nginx-deployment.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. namespace: my-zone # 这里声明了namespace和c/c++的名空间作用一样
  6. labels:
  7. app: nginx # 这个是deployment本身的标签
  8. spec:
  9. replicas: 3 # 复制集数量,也就是pods集群数量,启动pods的个数
  10. selector:
  11. matchLabels:
  12. app: MyNginx #deployment通过这个标签来查找要管理的pods
  13. template: # 创建出来的pods都是按照这个模板创建出来的
  14. metadata:
  15. labels:
  16. app: MyNginx #这里是创建出来的pods的标签
  17. spec: # 规格
  18. containers:
  19. - name: nginx-test # 这里是内部容器pods的名称,后边会加上一串数
  20. image: nginx:latest # 这里是说pods的镜像地址,我们可以自己打包上传到docker registry,本地需要配置docker.conf文件,账号和密码
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - containerPort: 80 # 这里是内部pods的运行端口,也就是服务端口,比如如果是redis就是6379,mysql就是3306

6.3,创建service,对namespace提供服务。nginx-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: nginx-service # 这个service的名字
  5. namespace: my-zone
  6. spec:
  7. selector: # 这里定义了一个选择器,要和pods的选择器值相同才可以被匹配上
  8. app: MyNginx
  9. ports:
  10. - protocol: TCP
  11. port: 8080 #这里是service暴露出去的端口
  12. targetPort: 80 # 这里是对内pods的端口

6.4,创建ingress,对公网提供服务。cat nginx-ingress.yaml

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress # 类型,有很多
  3. metadata:
  4. name: ingress-test
  5. namespace: my-zone
  6. spec:
  7. rules:
  8. - host: test.com # 外网的域名,会打到内部的service --> pods
  9. http:
  10. paths:
  11. - backend:
  12. serviceName: nginx-service # 这里对应我们的服务名称,也就是servcie name
  13. servicePort: 8080 # 服务的端口

 

 

 

7,常用命令

  1. 命令格式:kubectl 操作方式 资源类型 {资源名/可选参数} 命名空间 {导出格式/可选参数}
  2. 操作方式:get/describe/delete
  3. 资源类型: all,pods,servcies,ingress,deployment,config等等
  4. 资源名:一般来说格式为:类型 - 一串字符 - 一串字符 - 一串字符...
  5. 命名空间:-A,所有namespace, --namespace my-zone, my-zone命令空间内的资源
  6. 导出格式:-o yaml/ -o json,json没有试过,但是按道理来说应该是支持的。
  7. example:
  8. kubectl get all -A # 获取所有namespace下面的所有资源
  9. kubectl get pods --namespace my-zone # 获取my-zone namespace下面的pods
  10. kubectl get pods --namespace my-zone -o yaml # 获取my-zone namespace下面的pods
  11. kubectl describe ingress ingress-121213123213 --namespace my-zone # 查看详情
  12. kubectl logs pods/pods-121213123213 --namespace my-zone # logs稍微特别一点儿,可以看见标准输出,错误输出等。
  13. 操作yaml文件命令:
  14. kubectl apply/create/delete -f xxx.yaml
  15. apply --可用于更新和创建
  16. create --创建
  17. delete --删除
  18. 备注: 其实文件后缀不一定非要是yaml,别的名字也可以,只是格式内容需要是yaml格式的。

8,补充

8.1,Dockerfile的编写,需要区分run cmd exec三个类型的区别

8.2,docker出来的镜像可以不用推到https://registry-1.docker.io/这个网站上去,自己用的话,放在本地就可以。但是镜像拉取策略要改为:IfNotPresent,本地没有才会从远端仓拉取。

8.3,学习k8s最好的方式就是看官方文档,支持中文。https://kubernetes.io/zh/docs/home/,并且需要手动实践。

8.4,对于开发来说,docker和k8s是偏运维一点儿的。但是多了解一点儿知识总是没坏处的。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/578902
推荐阅读
相关标签
  

闽ICP备14008679号