提交 67363744 编写于 作者: 阳明的博客's avatar 阳明的博客

[add] 添加Gitlab

上级 e2e64e89
......@@ -97,3 +97,4 @@
* [Jenkins Pipeline 部署 Kubernetes 应用](docs/37.Jenkins Pipeline.md)
* [Jenkins BlueOcean](docs/38.Jenkins BlueOcean.md)
* [Harbor](docs/63.Harbor.md)
* [Gitlab](docs/64.Gitlab.md)
......@@ -12,3 +12,9 @@
* Kubernetes的运维
* 包管理工具 Helm 的使用
* 最后我们会实现基于 Kubernetes 的 CI/CD
---
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![qrcode](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -264,3 +264,12 @@ Removing network wordpress_default
```
该命令不会移除服务所使用的`数据卷`,如果你想移除数据卷请使用`docker volume rm`
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -90,3 +90,12 @@ cAdvisor 通过该 REST API 暴露监控数据,格式如下:
```
http://<hostname>:<port>/api/<version>/<request>
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -101,3 +101,13 @@ $ docker run --rm -p 8080:8080 cnych/docker-multi-stage-demo:latest
现在我们就把两个镜像的文件最终合并到一个镜像里面了。
文章中涉及到代码可以前往 github 查看:[https://github.com/cnych/docker-multi-stage-demo](https://github.com/cnych/docker-multi-stage-demo)
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -365,3 +365,12 @@ FROM my-node
### 官方仓库示例
这些官方仓库的 Dockerfile 都是参考典范:[https://github.com/docker-library/docs](https://github.com/docker-library/docs)
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -85,3 +85,12 @@ Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
![k8s service](./images/k8s-service.png)
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -55,3 +55,12 @@ Kubernetes 多组件之间的通信原理:
* scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定
* kubelet 检测到有新的 Pod 调度过来,通过 container runtime 运行该 Pod
* kubelet 通过 container runtime 取到 Pod 状态,并更新到 apiserver 中
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -349,3 +349,12 @@ ydzs-master1 Ready master 3h v1.10.0
到这里就算我们的集群部署成功了,接下来就可以根据我们的需要安装一些附加的插件,比如 Dashboard、Heapster、Ingress-Controller 等等,这些插件的安装方法就和我们之前手动安装集群的方式方法一样了,这里就不在重复了,有问题可以在`github`上留言讨论。
![kubeadm dashboard](./images/kubeadm-dashboard.png)
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -70,3 +70,12 @@ $ kubectl get secret admin-token-d5jsg -o jsonpath={.data.token} -n kube-system
然后在 dashboard 登录页面上直接使用上面得到的 token 字符串即可登录,这样就可以拥有管理员权限操作整个 kubernetes 集群的对象,当然你也可以为你的登录用户新建一个指定操作权限的用户。​​
![dashboard](./images/dashboard.png)
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -275,3 +275,11 @@ kube100-site 2 2 2 2 2m
> 可以使用[http://www.yamllint.com/](http://www.yamllint.com/)去检验 YAML 文件的合法性。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -98,3 +98,12 @@ etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yam
```
现在明白了吧,这种方式也为我们将集群的一些组件容器化提供了可能,因为这些 Pod 都不会受到 apiserver 的控制,不然我们这里`kube-apiserver`怎么自己去控制自己呢?万一不小心把这个 Pod 删掉了呢?所以只能有`kubelet`自己来进行控制,这就是我们所说的静态 Pod。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -79,4 +79,12 @@ $ sudo systemctl start docker
另外一种安装方式是可以直接下载指定的软件包直接安装即可,前往地址:[https://download.docker.com/linux/centos/7/x86_64/stable/Packages/](https://download.docker.com/linux/centos/7/x86_64/stable/Packages/) 找到合适的`.rpm`包下载,然后安装即可:
```shell
$ sudo yum install /path/to/package.rpm
```
\ No newline at end of file
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -87,3 +87,12 @@ spec:
```
另外`Hook`调用的日志没有暴露个给 Pod 的 event,所以只能通过`describe`命令来获取,如果有错误将可以看到`FailedPostStartHook``FailedPreStopHook`这样的 event。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -151,3 +151,12 @@ spec:
这就是`liveness probe`(存活探针)和`readiness probe`(可读性探针)的使用方法。在`Pod`的生命周期当中,我们已经学习了容器生命周期中的钩子函数和探针检测,下节课给大家讲解`Pod`层面生命周期的一个阶段:初始化容器。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -130,4 +130,12 @@ root@nginx:~# cat /usr/share/nginx/html/index.html
如果我们看到有**百度**相关的信息那么证明我们上面的初始化的工作就完成了。
这就是我们初始化容器的使用方法,到这里我们就把`Pod`的整个生命周期当中的几个主要阶段讲完了,第一个是容器的两个钩子函数:`PostStart`和`PreStop`,还有就是容器健康检查的两个探针:`liveness probe`和`readiness probe`,以及这节课的`Init Container`。下节课开始我们来讲解一些常用的控制器和`Pod`的结合。
```
\ No newline at end of file
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -110,3 +110,11 @@ $ kubectl rolling-update rc-demo -f rc-demo.yaml
好,这节课我们就给大家介绍了使用`RC`或者`RS`来管理我们的`Pod`,我们下节课来给大家介绍另外一种更加高级也是现在推荐使用的一个资源对象`Deployment`
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -232,4 +232,13 @@ $ kubectl rollout undo deployment nginx-deploy --to-revision=2
deployment "nginx-deploy" rolled back
```
现在可以用命令查看Deployment现在的状态了。
\ No newline at end of file
现在可以用命令查看Deployment现在的状态了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -130,3 +130,12 @@ hpa-nginx-deploy 1 1 1 1 4d
不过当前的`HPA`只有`CPU`使用率这一个指标,还不是很灵活的,在后面的课程中我们来根据我们自定义的监控来自动对`Pod`进行扩缩容。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -131,3 +131,12 @@ job "hello-1202039034" deleted
...
```
一旦 Job 被删除,由 Job 创建的 Pod 也会被删除。注意,所有由名称为 “hello” 的 Cron Job 创建的 Job 会以前缀字符串 “hello-” 进行命名。如果想要删除当前 Namespace 中的所有 Job,可以通过命令 kubectl delete jobs --all 立刻删除它们。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -127,3 +127,12 @@ spec:
当查询主机 my-service.prod.svc.cluster.local (后面服务发现的时候我们会再深入讲解)时,集群的 DNS 服务将返回一个值为 my.database.example.com 的 CNAME 记录。 访问这个服务的工作方式与其它的相同,唯一不同的是重定向发生在 DNS 层,而且不会进行代理或转发。 如果后续决定要将数据库迁移到 Kubernetes 集群中,可以启动对应的 Pod,增加合适的 Selector 或 Endpoint,修改 Service 的 type,完全不需要修改调用的代码,这样就完全解耦了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -292,3 +292,12 @@ port=3306
另外需要注意的是,当`ConfigMap`以数据卷的形式挂载进`Pod`的时,这时更新`ConfigMap`(或删掉重建`ConfigMap`),`Pod`内挂载的配置信息会热更新。这时可以增加一些监测配置文件变更的脚本,然后`reload`对应服务。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -271,3 +271,12 @@ eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiw
- Secret 可以存储 docker register 的鉴权信息,用在 ImagePullSecret 参数中,用于拉取私有仓库的镜像
- Secret 支持 Base64 加密
- Secret 分为 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三种类型,而 Configmap 不区分类型
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -354,3 +354,12 @@ $ docker run --name webserv2 -d -p 81:80 nginx:v2
至此,我们第一次完成了定制镜像,使用的是`docker commit`命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。
> 注意: docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用`Dockerfile`来完成。如果你想要定制镜像请查看下一小节。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
\ No newline at end of file
......@@ -270,3 +270,12 @@ $ kubectl get secret haimay-sa2-token-nxgqx -o jsonpath={.data.token} -n kube-sy
我们在最开始接触到`RBAC`认证的时候,可能不太熟悉,特别是不知道应该怎么去编写`rules`规则,大家可以去分析系统自带的 clusterrole、clusterrolebinding 这些资源对象的编写方法,怎么分析?还是利用 kubectl 的 get、describe、 -o yaml 这些操作,所以`kubectl`最基本的用户一定要掌握好。
`RBAC`只是`Kubernetes`中安全认证的一种方式,当然也是现在最重要的一种方式,后面我们再和大家一起聊一聊`Kubernetes`中安全设计。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -471,3 +471,12 @@ deployment.apps "wordpress-deploy" created
service "wordpress" created
```
看看最后能不能得到我们的最终成果呢?
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -287,3 +287,12 @@ www-web-1 Bound pv002 1Gi RWO 22m
我们会在下节课开始和大家讲解存储卷的使用的,所以这里我们先暂时不展开讲解了,避免大家糊涂。
当然 StatefulSet 还拥有其他特性,在实际的项目中,我们还是很少回去直接通过 StatefulSet 来部署我们的有状态服务的,除非你自己能够完全能够 hold 住,对于一些特定的服务,我们可能会使用更加高级的 Operator 来部署,比如 etcd-operator、prometheus-operator 等等,这些应用都能够很好的来管理有状态的服务,而不是单纯的使用一个 StatefulSet 来部署一个 Pod就行,因为对于有状态的应用最重要的还是数据恢复、故障转移等等。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -232,3 +232,12 @@ AccessModes 是用来对 PV 进行访问模式的设置,用于描述用户应
* Failed(失败): 表示该 PV 的自动回收失败
这就是 PV 的声明方法,下节课我们来和大家一起学习下 PVC 的使用方法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -336,3 +336,12 @@ $ ls /data/k8s/
> 不过大家要注意,并不是所有的存储后端的表现结果都是这样的,我们这里使用的是 nfs,其他存储后端肯能会有不一样的结果。
大家在使用 PV 和 PVC 的时候一定要注意这些细节,不然一不小心就把数据搞丢了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -314,3 +314,12 @@ default-www-nfs-web-2-pvc-e348250b-8b50-11e8-b585-525400db4df7
...
```
是不是也有对应的3个数据目录,这就是我们的 StorageClass 的使用方法,对于 StorageClass 多用于 StatefulSet 类型的服务,在后面的课程中我们还学不断的接触到。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -360,3 +360,12 @@ jenkins2-7c85b6f4bd-rfqgv 1/1 Running 3 1d
```
到这里我们就完成了使用 Kubernetes 动态生成 Jenkins Slave 的方法。下节课我们来给大家介绍下怎么在 Jenkins 中来发布我们的 Kubernetes 应用。最后感谢圈友`@TangT-newhope-成都`提供的帮助。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -373,3 +373,12 @@ Hello, Kubernetes!I'm from Jenkins CI!
![pipeline demo7](./images/pipeline-demo7.png)
最后点击保存,现在我们随便更改下源码,比如把 Jenkinsfile 中第一步更改成 Prepare,然后提交代码。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -168,3 +168,11 @@ BRANCH: master
> 我们会在单独的课程中对 Jenkinsfile 的声明式语法进行详细讲解,感兴趣的同学可以关注下。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -251,3 +251,12 @@ Commercial support is available at
加上 5000 端口,就正常访问到服务,再试一试访问:nginx-service.default.svc、nginx-service.default、nginx-service,不出意外这些域名都可以正常访问到期望的结果。
到这里我们是不是就实现了在集群内部通过 Service 的域名形式进行互相通信了,大家下去试着看看访问不同 namespace 下面的服务呢?下节课我们来给大家讲解使用 ingress 来实现集群外部的服务发现功能。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -164,3 +164,12 @@ Loaded image: alpine:latest
```shell
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -192,12 +192,12 @@ ingress.extensions "traefik-web-ui" created
创建完成后,我们应该怎么来测试呢?
* 第一步,在本地的**/etc/hosts**里面添加上 traefik.haimaxy.com 与 master 节点外网 IP 的映射关系
* 第二步,在浏览器中访问:http://traefik.haimaxy.com我们会发现并没有得到我们期望的 dashboard 界面,这是因为我们上面部署 traefik 的时候使用的是 NodePort 这种 Service 对象,所以我们只能通过上面的 30539 端口访问到我们的目标对象:http://traefik.haimaxy.com:30539
* 第二步,在浏览器中访问:http://traefik.haimaxy.com 我们会发现并没有得到我们期望的 dashboard 界面,这是因为我们上面部署 traefik 的时候使用的是 NodePort 这种 Service 对象,所以我们只能通过上面的 30539 端口访问到我们的目标对象:http://traefik.haimaxy.com:30539
![traefik dashboard](./images/ingress-config2.png)
加上端口后我们发现可以访问到 dashboard 了,而且在 dashboard 当中多了一条记录,正是上面我们创建的 ingress 对象的数据,我们还可以切换到 HEALTH 界面中,可以查看当前 traefik 代理的服务的整体的健康状态
![traefik health](./images/ingress-config3.png)
* 第三步,上面我们可以通过自定义域名加上端口可以访问我们的服务了,但是我们平时服务别人的服务是不是都是直接用的域名啊,http 或者 https 的,几乎很少有在域名后面加上端口访问的吧?为什么?太麻烦啊,端口也记不住,要解决这个问题,怎么办,我们只需要把我们上面的 traefik 的核心应用的端口隐射到 master 节点上的 80 端口,是不是就可以了,因为 http 默认就是访问 80 端口,但是我们在 Service 里面是添加的一个 NodePort 类型的服务,没办法射 80 端口,怎么办?这里就可以直接在 Pod 中指定一个 hostPort 即可,更改上面的 traefik.yaml 文件中的容器端口:
* 第三步,上面我们可以通过自定义域名加上端口可以访问我们的服务了,但是我们平时服务别人的服务是不是都是直接用的域名啊,http 或者 https 的,几乎很少有在域名后面加上端口访问的吧?为什么?太麻烦啊,端口也记不住,要解决这个问题,怎么办,我们只需要把我们上面的 traefik 的核心应用的端口隐射到 master 节点上的 80 端口,是不是就可以了,因为 http 默认就是访问 80 端口,但是我们在 Service 里面是添加的一个 NodePort 类型的服务,没办法射 80 端口,怎么办?这里就可以直接在 Pod 中指定一个 hostPort 即可,更改上面的 traefik.yaml 文件中的容器端口:
```yaml
containers:
......@@ -224,3 +224,12 @@ $ kubectl apply -f traefik.yaml
> 如果你有多个边缘节点的话,可以在每个边缘节点上部署一个 ingress-controller 服务,然后在边缘节点前面挂一个负载均衡器,比如 nginx,将所有的边缘节点均作为这个负载均衡器的后端,这样就可以实现 ingress-controller 的高可用和负载均衡了。
到这里我们就通过 ingress 对象对外成功暴露了一个服务,下节课我们再来详细了解 traefik 的更多用法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -311,3 +311,12 @@ spec:
- host:
...
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -246,3 +246,11 @@ No resources found.
还有更多关于`Helm`的使用命令,我们可以前往[官方文档](https://docs.helm.sh/helm/helm)查看。下节课我们再来和大家详细讲解。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -562,3 +562,11 @@ release "mewing-squid" deleted
```
我们这里只是讲到了 Helm 的一些常用的方法,更多用法我们将在后面的课程中和大家接触到。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -307,3 +307,11 @@ data:
可以看到模板中的参数已经被 values.yaml 文件中的值给替换掉了。虽然以这种方式构建数据是可以的,但我们还是建议保持 value 树浅一些,平一些,这样维护起来要简单一点。
到这里,我们已经看到了几个内置对象的使用方法,并用它们将信息注入到了模板之中。下节课我们来看看模板引擎中的其他用法,比如**函数、管道、控制结构**等等的用法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -179,3 +179,12 @@ data:
```
我们可以看到`myvalue`值被渲染成了**Hello World**,证明我们的默认值生效了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -364,3 +364,12 @@ data:
```
直接使用`range`循环,用变量`$key``$value`来接收字段`.Values.course`的键和值。这就是变量在 Helm 模板中的使用方法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -277,3 +277,11 @@ data:
可以看到是符合我们的预期,所以在 Helm 模板中我们使用 include 函数要比 template 更好,可以更好地处理 YAML 文件输出格式。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -257,3 +257,11 @@ data:
我们可以看到两个模板中都输出了`allin: helm`这样的值,全局变量对于传递这样的信息非常有用,不过也要注意我们不能滥用全局值。
另外值得注意的是我们在学习命名模板的时候就提到过父 chart 和子 chart 可以共享模板。任何 chart 中的任何定义块都可用于其他 chart,所以我们在给命名模板定义名称的时候添加了 chart 名称这样的前缀,避免冲突。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -140,3 +140,10 @@ annotations:
"helm.sh/hook-delete-policy": "before-hook-creation" 在 hook 中的注释,如果在新的 hook 启动前有一个 hook 的话,会使 Tiller 将以前的release 中的 hook 删除,而这个 hook 同时它可能正在被其他一个策略使用。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -170,3 +170,11 @@ $ sudo service docker restart
### 其他
对于 Docker for Windows、Docker for Mac 在设置中编辑`daemon.json`增加和上边一样的字符串即可。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -178,3 +178,11 @@ spec:
下节课我们再和大家讲解关于 Pod 调度的一些具体使用方法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -404,3 +404,11 @@ node "node02" untainted
这就是污点和容忍的使用方法。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -313,3 +313,12 @@ prometheus NodePort 10.111.118.104 <none> 9090:30987/TCP
除了简单的直接使用采集到的一些监控指标数据之外,这个时候也可以使用强大的 PromQL 工具,PromQL其实就是 prometheus 便于数据聚合展示开发的一套 ad hoc 查询语言的,你想要查什么找对应函数取你的数据好了。
下节课我们再来和大家学习怎样使用 Prometheus 来监控 Kubernetes 系统的组件以及常用的资源对象的监控。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -218,3 +218,11 @@ $ curl -X POST "http://10.102.74.90:9090/-/reload"
除了监控群集中部署的服务之外,我们下节课再和大家学习怎样监视 Kubernetes 群集本身。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -269,3 +269,11 @@ Get http://10.151.30.57:10250/metrics: net/http: HTTP/1.x transport connection b
到这里我们就把 Kubernetes 集群节点的使用 Prometheus 监控起来了,下节课我们再来和大家学习怎样监控 Pod 或者 Service 之类的资源对象。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -207,3 +207,12 @@ service "kube-state-metrics" created
到这里我们就完成了 Kubernetes 集群上部署应用的监控,下节课我们再来和大家介绍下怎样使用 `Grafana`来展示我们的这些监控数据。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -438,3 +438,11 @@ $ kubectl apply -f grafana-deploy.yaml
到这里就完成了使用 grafana 来展示 Kubernetes 集群的监控图表信息以及报警配置,但是我们明显可以感觉到 grafana 的优势在于图表的展示,报警功能有点弱,所以一般来说,在生产环境我们不会直接使用 grafana 的报警功能,更多的是使用功能更加强大的 `AlertManager`,下节课我们再来和大家介绍了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -448,3 +448,11 @@ $ kubectl logs -f dingtalk-hook-cc677c46d-gf26f -n kube-ops
到这里我们就完成了完全手动的控制 Prometheus、Grafana 以及我们的 AlertManager 的报警功能,接下来我们会给大家讲解 Kubernetes 中更加自动化的监控方案:Prometheus-Operator。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -219,69 +219,10 @@ containers:
下节课我们再来和大家介绍怎样来完全自定义一个 ServiceMonitor 以及 AlertManager 相关的配置。
$ kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key --from-file=/etc/kubernetes/pki/etcd/ca.crt
secret "etcd-certs" created
kubectl exec -it prometheus-k8s-0 /bin/sh -n monitoring
Defaulting container name to prometheus.
Use 'kubectl describe pod/prometheus-k8s-0 -n monitoring' to see all of the containers in this pod.
/ $ ls /etc/prometheus/secrets/etcd-certs/
ca.crt server.crt server.key
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: etcd-k8s
namespace: monitoring
labels:
k8s-app: etcd-k8s
spec:
jobLabel: k8s-app
endpoints:
- port: port
interval: 30s
scheme: https
tlsConfig:
caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
certFile: /etc/kubernetes/pki/etcd/healthcheck-client.crt
keyFile: /etc/kubernetes/pki/etcd/healthcheck-client.key
insecureSkipVerify: true
selector:
matchLabels:
k8s-app: etcd
namespaceSelector:
matchNames:
- kube-system
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
apiVersion: v1
kind: Service
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
spec:
type: ClusterIP
clusterIP: None
ports:
- name: port
port: 12379
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: etcd-k8s
namespace: kube-system
labels:
k8s-app: etcd
subsets:
- addresses:
- ip: 10.151.30.57
nodeName: etc-master
ports:
- name: port
port: 2379
protocol: TCP
\ No newline at end of file
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -472,3 +472,11 @@ templates:
创建成功后,Secret 对象将会挂载到 AlertManager 对象创建的 AlertManager Pod 中去。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -145,3 +145,11 @@ root@2affd44b4667:/# history
这样就可以记录在容器输入过的命令了。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -310,3 +310,11 @@ spec:
到这里 Prometheus Operator 系列教程就告一段落了,大家还有什么问题可以到微信群里面继续交流,接下来会和大家介绍 Kubernetes 日志收集方便的知识点。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -254,3 +254,12 @@ spec:
除了上面的几种方案之外,我们也完全可以通过直接在应用程序中去显示的将日志推送到日志后端,但是这种方式需要代码层面的实现,也超出了 Kubernetes 本身的范围。
下节课我们给大家演示下具体的日志收集的操作方法,或者你有更好的方案吗?
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -870,3 +870,12 @@ Pod 创建并运行后,回到 Kibana Dashboard 页面,在上面的`Discover`
到这里,我们就在 Kubernetes 集群上成功部署了 EFK ,要了解如何使用 Kibana 进行日志数据分析,可以参考 Kibana 用户指南文档:[https://www.elastic.co/guide/en/kibana/current/index.html](https://www.elastic.co/guide/en/kibana/current/index.html)
当然对于在生产环境上使用 Elaticsearch 或者 Fluentd,还需要结合实际的环境做一系列的优化工作,本文中涉及到的资源清单文件都可以在[https://github.com/cnych/kubernetes-learning/tree/master/efkdemo](https://github.com/cnych/kubernetes-learning/tree/master/efkdemo)找到。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -710,3 +710,12 @@ registry.qikqiak.com/library/busybox latest d8233ab899d4 7
```
到这里证明上面我们的私有 docker 仓库搭建成功了,大家可以尝试去创建一个私有的项目,然后创建一个新的用户,使用这个用户来进行 pull/push 镜像,Harbor 还具有其他的一些功能,比如镜像复制,大家可以自行测试,感受下 Harbor 和官方自带的 registry 仓库的差别。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
# 64. Gitlab 的安装使用
`Gitlab`官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装,但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置,所以我们这里使用自定义的方式来安装,也就是自己来定义一些资源清单文件。
`Gitlab`主要涉及到3个应用:Redis、Postgresql、Gitlab 核心程序,实际上我们只要将这3个应用分别启动起来,然后加上对应的配置就可以很方便的安装 Gitlab 了,我们这里选择使用的镜像不是官方的,而是 Gitlab 容器化中使用非常多的一个第三方镜像:`sameersbn/gitlab`,基本上和官方保持同步更新,地址:[http://www.damagehead.com/docker-gitlab/](http://www.damagehead.com/docker-gitlab/)
如果我们已经有可使用的 Redis 或 Postgresql 服务的话,那么直接配置在 Gitlab 环境变量中即可,如果没有的话就单独部署。
首先部署需要的 Redis 服务,对应的资源清单文件如下:(gitlab-redis.yaml)
```yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: redis
namespace: kube-ops
labels:
name: redis
spec:
template:
metadata:
name: redis
labels:
name: redis
spec:
containers:
- name: redis
image: sameersbn/redis
imagePullPolicy: IfNotPresent
ports:
- name: redis
containerPort: 6379
volumeMounts:
- mountPath: /var/lib/redis
name: data
livenessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- redis-cli
- ping
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: kube-ops
labels:
name: redis
spec:
ports:
- name: redis
port: 6379
targetPort: redis
selector:
name: redis
```
然后是数据库 Postgresql,对应的资源清单文件如下:(gitlab-postgresql.yaml)
```yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: postgresql
namespace: kube-ops
labels:
name: postgresql
spec:
template:
metadata:
name: postgresql
labels:
name: postgresql
spec:
containers:
- name: postgresql
image: sameersbn/postgresql:10
imagePullPolicy: IfNotPresent
env:
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: DB_EXTENSION
value: pg_trgm
ports:
- name: postgres
containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql
name: data
livenessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 30
timeoutSeconds: 5
readinessProbe:
exec:
command:
- pg_isready
- -h
- localhost
- -U
- postgres
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: postgresql
namespace: kube-ops
labels:
name: postgresql
spec:
ports:
- name: postgres
port: 5432
targetPort: postgres
selector:
name: postgresql
```
然后就是我们最核心的 Gitlab 的应用,对应的资源清单文件如下:(gitlab.yaml)
```yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: gitlab
namespace: kube-ops
labels:
name: gitlab
spec:
template:
metadata:
name: gitlab
labels:
name: gitlab
spec:
containers:
- name: gitlab
image: sameersbn/gitlab:11.8.1
imagePullPolicy: IfNotPresent
env:
- name: TZ
value: Asia/Shanghai
- name: GITLAB_TIMEZONE
value: Beijing
- name: GITLAB_SECRETS_DB_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_SECRET_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_SECRETS_OTP_KEY_BASE
value: long-and-random-alpha-numeric-string
- name: GITLAB_ROOT_PASSWORD
value: admin321
- name: GITLAB_ROOT_EMAIL
value: 517554016@qq.com
- name: GITLAB_HOST
value: git.qikqiak.com
- name: GITLAB_PORT
value: "80"
- name: GITLAB_SSH_PORT
value: "22"
- name: GITLAB_NOTIFY_ON_BROKEN_BUILDS
value: "true"
- name: GITLAB_NOTIFY_PUSHER
value: "false"
- name: GITLAB_BACKUP_SCHEDULE
value: daily
- name: GITLAB_BACKUP_TIME
value: 01:00
- name: DB_TYPE
value: postgres
- name: DB_HOST
value: postgresql
- name: DB_PORT
value: "5432"
- name: DB_USER
value: gitlab
- name: DB_PASS
value: passw0rd
- name: DB_NAME
value: gitlab_production
- name: REDIS_HOST
value: redis
- name: REDIS_PORT
value: "6379"
ports:
- name: http
containerPort: 80
- name: ssh
containerPort: 22
volumeMounts:
- mountPath: /home/git/data
name: data
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 180
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
volumes:
- name: data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: kube-ops
labels:
name: gitlab
spec:
ports:
- name: http
port: 80
targetPort: http
- name: ssh
port: 22
targetPort: ssh
selector:
name: gitlab
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gitlab
namespace: kube-ops
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: git.qikqiak.com
http:
paths:
- backend:
serviceName: gitlab
servicePort: http
```
> 要注意我们这里应用数据没有做数据持久化,只是使用的`emptyDir: {}`类型的 volume,Pod 挂掉后,对应的数据也就没有了,所以要在正式的环境中使用一定要做数据的持久化,比如添加 PV/PVC 或者 StorageClass。
要注意的是其中 Redis 和 Postgresql 相关的环境变量配置,另外,我们这里添加了一个 Ingress 对象,来为我们的 Gitlab 配置一个域名`git.qikqiak.com`,这样应用部署完成后,我们就可以通过该域名来访问了,然后直接部署即可:
```shell
$ kubectl create -f gitlab-redis.yaml gitlab-postgresql.yaml gitlab.yaml
```
创建完成后,查看 Pod 的部署状态:
```shell
$ kubectl get pods -n kube-ops
NAME READY STATUS RESTARTS AGE
gitlab-7d855554cb-twh7c 1/1 Running 0 10m
postgresql-8566bb959c-2tnvr 1/1 Running 0 17h
redis-8446f57bdf-4v62p 1/1 Running 0 17h
```
可以看到都已经部署成功了,然后我们可以通过 Ingress 中定义的域名`git.qikqiak.com`(需要做 DNS 解析或者在本地 /etc/hosts 中添加映射)来访问 Portal:
![gitlab portal](https://ws1.sinaimg.cn/large/006tKfTcgy1g0u81axrwlj318y0u0wj0.jpg)
使用用户名 root,和部署的时候指定的超级用户密码`GITLAB_ROOT_PASSWORD=admin321`即可登录进入到首页:
![gitlab homepage](https://ws3.sinaimg.cn/large/006tKfTcgy1g0u85rzqbfj311g0u0jx1.jpg)
Gitlab 运行后,我们可以注册为新用户并创建一个项目,还可以做很多的其他系统设置,比如设置语言、设置应用风格样式等等。
点击`Create a project`创建一个新的项目,和之前 Github 使用上没有多大的差别:
![create gitlab project](https://ws1.sinaimg.cn/large/006tKfTcgy1g0u8gpdwqoj31h90u0483.jpg)
创建完成后,我们可以添加本地用户的一个`SSH-KEY`,这样我们就可以通过 SSH 来拉取或者推送代码了。SSH 公钥通常包含在`~/.ssh/id_rsa.pub` 文件中,并以`ssh-rsa`开头。如果没有的话可以使用`ssh-keygen`命令来生成,`id_rsa.pub`里面的内容就是我们需要的 SSH 公钥,然后添加到 Gitlab 中。
由于平时使用的 ssh 默认是 22 端口,现在如果用默认的 22 端口去连接,是没办法和 Gitlab 容器中的 22 端口进行映射的,因为我们只是通过 Service 的 22 端口进行了映射,要想通过节点去进行 ssh 链接就需要在节点上一个端口和容器内部的22端口进行绑定,所以这里我们可以通过 NodePort 去映射 Gitlab 容器内部的22端口,比如我们将环境变量设置为`GITLAB_SSH_PORT=30022`,将 Gitlab 的 Service 也设置为 NodePort 类型:
```yaml
apiVersion: v1
kind: Service
metadata:
name: gitlab
namespace: kube-ops
labels:
name: gitlab
spec:
ports:
- name: http
port: 80
targetPort: http
- name: ssh
port: 22
targetPort: ssh
nodePort: 30022
type: NodePort
selector:
name: gitlab
```
注意上面 ssh 对应的 nodePort 端口设置为 30022,这样就不会随机生成了,重新更新下 Deployment 和 Service,更新完成后,现在我们在项目上面 Clone 的时候使用 ssh 就会带上端口号了:
![gitlab ssh](https://ws4.sinaimg.cn/large/006tKfTcgy1g0uecaybqfj31kg0kin17.jpg)
现在就可以使用`Clone with SSH`的地址了,由于上面我们配置了 SSH 公钥,所以就可以直接访问上面的仓库了:
```shell
$ git clone ssh://git@git.qikqiak.com:30022/root/gitlab-demo.git
Cloning into 'gitlab-demo'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
```
然后随便在该项目下面添加一些资源:
```shell
$ echo "# hello world" > README.md
$ git add .
$ git commit -m 'hello world'
[master (root-commit) 63de7cb] hello world
1 file changed, 1 insertion(+)
create mode 100644 README.md
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 224 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@git.qikqiak.com:30022/root/gitlab-demo.git
* [new branch] master -> master
```
然后刷新浏览器,就可以看到刚刚创建的 Git 仓库中多了一个 README.md 的文件:
![git commit](https://ws4.sinaimg.cn/large/006tKfTcgy1g0uekpjdcfj31b10u0af1.jpg)
到这里就表明我们的 Gitlab 就成功部署到了 Kubernetes 集群当中了。
本文中涉及到的所有资源清单文件参考地址:[https://github.com/cnych/kubeapp/tree/master/gitlab](https://github.com/cnych/kubeapp/tree/master/gitlab)
下节课和大家开始介绍基于 Gitlab 的 CI/CD 实现。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
# 65. Gitlab CI
上节课我们使用 Helm 快速的将 Gitlab 安装到了我们的 Kubernetes 集群中
......@@ -122,3 +122,12 @@ $ route -n
```
Docker 的跨主机通信我们这里就先暂时不讲解,我们在后面的`Kubernetes`课程当中会用到。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -281,3 +281,12 @@ up:格式为**docker-compose up [options] [SERVICE...]**,该命令十分强
`--no-recreate`如果容器已经存在了,则不重新创建,不能与 `--force-recreate`同时使用。
`--no-build`不自动构建缺失的服务镜像。
* -t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -156,3 +156,12 @@ Docker version 17.10.0-ce, build f4ffd25
```shell
$ docker-machine COMMAND --help
```
---
[点击查看本文视频](https://youdianzhishi.com/course/6n8xd6/)
扫描下面的二维码(或微信搜索`k8s技术圈`)关注我们的微信公众帐号,在微信公众帐号中回复 **加群** 即可加入到我们的 kubernetes 讨论群里面共同学习。
![k8s技术圈二维码](https://www.qikqiak.com/img/posts/qrcode_for_gh_d6dd87b6ceb4_430.jpg)
......@@ -22,20 +22,20 @@
GitHub地址:[https://github.com/cnych/kubernetes-learning/tree/master/docs](https://github.com/cnych/kubernetes-learning/)
视频课程在线地址:[https://www.haimaxy.com/course/6n8xd6/](https://www.haimaxy.com/course/6n8xd6/)
视频课程在线地址:[https://youdianzhishi.com/course/6n8xd6/](https://youdianzhishi.com/course/6n8xd6/)
## 社区&读者交流
* 博客:[阳明的博客](https://blog.qikqiak.com/)
* 微信群:`k8s`技术圈,扫描我的微信二维码,[阳明](https://blog.qikqiak.com/page/about/),或直接搜索微信号**iEverything**后拉您入群,请增加备注(k8s或kubernetes)
* 博客:[阳明的博客](https://www.qikqiak.com/)
* 微信群:`k8s`技术圈,扫描我的微信二维码,[阳明](https://www.qikqiak.com/page/about/),或直接搜索微信号**iEverything**后拉您入群,请增加备注(k8s或kubernetes)
* 知乎专栏:[k8s技术圈](https://zhuanlan.zhihu.com/kube100)
* 开发者头条:[k8s技术圈](https://toutiao.io/subjects/268333)
* 微信公众号:扫描下面的二维码关注微信公众号`k8s技术圈`
![k8s公众帐号](./images/k8s-qrcode.png)
* 优点知识:[优点知识](https://www.haimaxy.com/)是一个综合的技术学习平台,本书配套的视频教程将会发布在该平台上面,感兴趣的朋友可以扫描下发的二维码关注自己感兴趣的课程。
* 优点知识:[优点知识](https://youdianzhishi.com/)是一个综合的技术学习平台,本书配套的视频教程将会发布在该平台上面,感兴趣的朋友可以扫描下发的二维码关注自己感兴趣的课程。
![优点知识服务号](./images/ydzs-qrcode.png)
![优点知识小程序](./images/ydzs-xcx.png)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册