华为云k8s环境部署应用

目录

1.搭建Docker镜像仓库:

1.创建docker镜像仓库

2.Docker镜像仓库访问:

3.配置外网访问:

4.设置允许http方式访问:

5.重启docker服务:

6.访问docker hub:

7.Docker镜像仓库中删除镜像:

8.删除本地镜像(节省存储空间):

2.生成镜像:

3.华为云创建Pod:

1.打开云容器引擎CCE

​编辑

2.体验新版:

​编辑

3.打开我们的k8s集群:

4.配置项与秘钥:

​编辑

5.工作负载 -> 命名空间 

6.镜像创建(其实就是创建Pod)

7.服务注册与发现--service:

4.关于Ingress:

1.问题及答案:

2.华为云前后端打通:

3.安装nginx ingress controller:

4.nginx ingress工作原理(重要):

5.自动化流程

6.其它基础知识:

1.ELB配置避坑:

2.Docker使用避坑:

3.运行helloworld 镜像


1.搭建Docker镜像仓库:

1.创建docker镜像仓库

参考文档:

搭建Docker镜像仓库_Kareza's Blog-CSDN博客_搭建docker镜像仓库

你必须知道的Docker镜像仓库的搭建 - EdisonZhou - 博客园 (cnblogs.com)

生成用户名密码:配置带用户权限的docker registry v2 - adolfmc - 博客园 (cnblogs.com),docker registry 2 with tls and basic authentication-布布扣-bubuko.com

本文是在k8s集群中的一个节点搭建了Docker镜像仓库。并且是使用docker镜像registry去搭建的,具体的搭建指令如下:

关于使用https和创建账号密码,请看上面的参考文章。

带https证书和账户密码:
docker run -d -p 5000:5000 --restart=always -v /docker/registry/auth:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_HTTP_TLS_CERTIFICATE=/docker/registry/registry.crt
-e REGISTRY_HTTP_TLS_KEY=/docker/registry/registry.key -v /usr/local/dockerregistry:/var/lib/registry/ registry:latest

有账号密码,但是不带https证书:
docker run -d -p 5000:5000 --restart=always -v /docker/registry/auth:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /usr/local/dockerregistry:/var/lib/registry/ registry:latest

2.Docker镜像仓库访问:

内网地址:10.***.**.208:31000  账号密码:crm/*******

外网地址:119.***.***.184:31000  账号密码:crm/*******

搭建Docker镜像仓库registry的web UI:

(1).使用hyper/docker-registry-web(没有成功,账号密码问题)

重要:hyper/docker-registry-web - Docker Image | Docker Hub

搭建docker registry UI_qq_31292011的博客-CSDN博客

重要:搭建Docker私有仓库&用户密码认证&web可视化界面 - David~Chen - 博客园 (cnblogs.com)

docker-compose 使用介绍 - Cocowool - 博客园 (cnblogs.com)

指令:docker run -itd -p 31200:8080 --name registry-web --link fe5ce862196d -e REGISTRY_URL=http://119.***.***.184:31000/v2 -e REGISTRY_NAME=119.***.***.184:31000 hyper/docker-registry-web

浏览器输入119.3.248.184:31200 //就可以看到仓库里面的镜像了

(2).使用konradkleine/docker-registry-frontend:v2(成功)

文档:docker registry 设置账号密码 - CSDN

官网:konradkleine/docker-registry-frontend - Docker Image | Docker Hub

备份:docker-registry私有镜像库搭建并配置密码登录_知难行难1985的博客-CSDN博客 

其它参考:Dockerfile Registry WebUI 之 docker-registry-frontend 高级应用_securitit的博客-CSDN博客

创建docker registry指令:

docker run -d -p 5000:5000 --name registry-srv --restart=always -v /docker/registry/auth:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -e REGISTRY_STORAGE_DELETE_ENABLED=true -v /usr/local/dockerregistry:/var/lib/registry/ registry:latest

创建konradkleine/docker-registry-frontend:v2指令:

docker run -d -e ENV_DOCKER_REGISTRY_HOST=10.***.***.208 -e ENV_DOCKER_REGISTRY_PORT=5000 -p 31200:80 konradkleine/docker-registry-frontend:v2

华为云k8s环境部署应用_第1张图片

3.配置外网访问:

入方向规则,有一条TCP规则允许所有客户端访问,但是端口限制在30000-32767,所以我们这里选择将docker hub的端口设置为31000.

华为云k8s环境部署应用_第2张图片

外网访问效果:

4.设置允许http方式访问:

华为云k8s环境部署应用_第3张图片

5.重启docker服务:

systemctl daemon-reload

systemctl restart docker

6.访问docker hub:

curl -u crm:****** -XGET http://10.17.****.208:5000/v2/_catalog

列出Docker镜像仓库中所有的镜像 :

查看某个镜像(brucetest)的所有版本(tag)信息:

119.3.***.184:31000/v2/brucetest/tags/list

7.Docker镜像仓库中删除镜像:

参看文章:(1条消息) 如何删除本地私有docker镜像仓库中的镜像_yanwei2020的博客-CSDN博客_docker删除本地镜像

使能删除功能:增加delete配置

docker exec -it fe5ce862196d vi /etc/docker/registry/config.yml

华为云k8s环境部署应用_第4张图片

重启容器:

docker restart fe5ce862196d

以删除wit-c****nent:2.5为例。

获取镜像的摘要信息:

curl -u cr****:n**** --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://119.***.***.184:31000/v2/wit-component/manifests/2.5

华为云k8s环境部署应用_第5张图片

删除镜像:

利用上面得到的摘要信息,删除镜像

curl -u c***:new*** -I -X DELETE http://119.***.***.184:31000/v2/wit-component/manifests/sha256:66f7e2587a92a505b709dbd66a639218bcbf1402ca05ff59f9e3b754ee0b1da3

8.删除本地镜像(节省存储空间):

重点说明一下删除tag为none的镜像,批量删除tag 为none 的镜像  ,释放磁盘空间

docker rmi `docker images|grep none| awk '{print $3}'`

2.生成镜像:

我们可以手动生成镜像.

  1. 将生成的jar包以及Dockerfile文件上传到任何一台K8s服务器,将两个文件放到同一文件夹
  2. 然后执行生成docker镜像指令: docker build -t docker镜像名称 .

华为云k8s环境部署应用_第6张图片

华为云k8s环境部署应用_第7张图片

Docker镜像上传和下载:

参考文档:Docker: 上传镜像至私有仓库 - SegmentFault 思否

参考文档:Docker创建镜像以及私有仓库_许你一生的远方的技术博客_51CTO博客

接下来要将生成的docker镜像上传到私有Docker镜像仓库:

给上面生成的Docker镜像 brucetest tag

docker tag brucetest:1.0 10.17.*****.208:31000/brucetest:1.0注意:这里新tagIP地址 跟后面docker login的地址要一致

登录我们的私有docker镜像仓库:

docker login 10.17.****.208:31000

上传镜像到我们的私有docker镜像仓库

docker push 10.17.*****.208:31000/brucetest:1.0

在其它服务器上,将镜像pull下来:

docker pull 10.17.*****.208:31000/brucetest:1.0

访问docker 镜像仓库,看看我们上传镜像是否成功:

curl -u crm:****** -XGET http://10.17.*****.208:31000/v2/_catalog

3.华为云创建Pod:

1.打开云容器引擎CCE

华为云k8s环境部署应用_第8张图片

2.体验新版:

华为云k8s环境部署应用_第9张图片

3.打开我们的k8s集群:

华为云k8s环境部署应用_第10张图片

4.配置项与秘钥:

为我们的私有docker镜像仓库,创建一个秘钥,其实就是配置怎样去访问私有docker镜像仓库。

华为云k8s环境部署应用_第11张图片

这是一个已经创建好的秘钥:

华为云k8s环境部署应用_第12张图片

5.工作负载 -> 命名空间 

华为云k8s环境部署应用_第13张图片

6.镜像创建(其实就是创建Pod)

点击页面右上角的“镜像创建”

填写基本信息:

华为云k8s环境部署应用_第14张图片

填写容器配置信息:

“镜像名称”填写我们上传到私有docker镜像仓库的镜像名字 -> 10.17.******.208:31000/brucetest:1.0;”镜像访问凭证”选择上面我们为自己的私有docker镜像仓库配置的秘钥

华为云k8s环境部署应用_第15张图片

服务配置:

然后,为将要创建的Pod创建一个服务service,做服务发现(为了在Pod外部访问该Pod,k8s集群或者外网)。

先配置“集群内访问”,“集群内访问”是为了实现在k8s集群内,任何一个节点都可以访问该Pod,其实就是做了Pod端口到节点端口的映射但是此时外网是不能够访问的。

华为云k8s环境部署应用_第16张图片

为了实现外网访问,我们需要再配置节点访问。

“服务亲和”选择集群级别,这样的话只要k8s集群中任何一个节点绑定了EIP(弹性公网IP),那么都可以实现外网访问该Pod。

华为云k8s环境部署应用_第17张图片

 查看创建的Pod(无状态负载)以及容器组:

华为云k8s环境部署应用_第18张图片

华为云k8s环境部署应用_第19张图片

7.服务注册与发现--service:

创建好的Pod(无状态负载)怎样访问呢? 使用上面创建Pod过程中创建的服务service -- brucetest-new,每个Pod(或者集群)对应有一个service,一一对应(也可以一个pod对应2个或多个service,这样访问任何一个service,都可以访问该pod)。

Pod,service,deployment controller(或者其它类型的controller),这是一个k8s中的标配。

服务service中给出了访问Pod的ip和端口 ,例如我们上面创建的brucetest-new,对应的是10.247.****.214:8090(ClusterIP方式,只能从集群内部访问)。(由于也配置了NodePort,所以支持直接访问Node ip:32402,从集群外部访问

华为云k8s环境部署应用_第20张图片

登录任意k8s节点去访问创建的Pod,然后执行下面指令(访问微服务的API)

curl http://10.247.******.214:8090/hello/world(根据具体的微服务的API)

成功返回,证明这个Pod可以在k8s集群的任何节点进行访问。

关于集群外访问

可以通过上面的NodePort service的方式实现,但是只能通过node ip: port的方式去访问,如果要通过域名去访问,那么需要通过ingress-nginx来实现,当然需要其它的组件(nginx)进行转发,转发到ingress。

下面这部分内容忽略:因为无法为每个k8s节点绑定EIP,只能通过ELB的方式将外部请求导入进来。目前只支持k8s集群内访问,k8s集群内任何节点都可以访问创建的Pod,不管Pod具体被部署到哪个节点。但是想要实现集群外访问,需要将k8s集群内的任意一个节点,绑定一个EIP,就是给该节点的的网卡绑定一个EIP(具体配置要看弹性负载均衡ELB,ELB绑定一个EIP),EIP公网IP,目前只有内网IP。这样就能实现外网访问。

华为云k8s环境部署应用_第21张图片

华为云k8s环境部署应用_第22张图片

4.关于Ingress:

1.问题及答案:

1.EIP怎样绑定K8s集群?是通过配置ELB吗?还是说需要申请单独的EIP?

答案:通过ELB指向集群中的一个或者几个nginx,nginx 把流量指到K8s集群

2.客户端怎样访问nginx? Nginx在k8s集群中,怎样配置外部访问?通过ELB吗?

答案:通过ELB

3.Nginx动静分离,怎样配置访问后端微服务?

答案:都指到K8s ,由ingress 去分配流量

4.正在运行中的工作负载(Pod),怎样修改其服务发现service?通过”编辑YAML”吗?修改之后怎样生效?

答案:编辑yaml ,保存--更新生效,不过我建议直接删了重写一个

5.怎样给Pod扩展资源,比如加大内存。

答案:工作负载--选中pod--容器管理--编辑---填写合适的内容----升级工作负载

6.监控功能不能使用,什么原因? 是不是微服务中没有集成actuator造成的?

答案:可以用  看不到的原因是没有AOM的权限

2.华为云前后端打通:

整体流程:
重要:前端请求 -> ELB -> nginx转发器(手动部署到k8s集群中) -> ingress-nginx (外部访问k8s集群) -> service -> Pod微服务

3.安装nginx ingress controller:

华为云文档:Ingress概述_云容器引擎 CCE_用户指南_网络管理_Ingress_华为云 (huaweicloud.com),介绍了什么是ingress-nginx.

重要的参考文章:Kubernetes之Ingress-nginx部署使用_周周!的博客-CSDN博客

相关文章:给k8s集群中的节点打标签 (1条消息) k8s-节点打标签_小二来碗面的博客-CSDN博客_k8s打标签

怎样创建ingress-nginx-controller工作负载?Ingress-nginx官网: kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes (github.com), Installation Guide - NGINX Ingress Controller (kubernetes.github.io)文档中:

华为云k8s环境部署应用_第23张图片

具体需要执行下面的指令:

kubectl apply -f deploy.yaml

deploy.yaml中定义了ingress-nginx-controller工作负载要部署到哪个节点,需要给这个节点打标签,可以通过指令,也可以通过在华为云操作界面上直接生成。

deploy.yaml资源清单文件中的定义如下,所以需要给k8s集群中相应节点(随便选一个打标签 node = ingress-node

给节点打标签, 键为node, 值为ingress-node(也可以通过命令)

华为云k8s环境部署应用_第24张图片

执行指令去安装nginx ingress controller:

kubectl apply -f deploy.yaml

华为云k8s环境部署应用_第25张图片

最后生成的ingress-nginx-controller工作负载,如下:

华为云k8s环境部署应用_第26张图片

当然了,可以创建多个实例,例如创建了3个实例

华为云k8s环境部署应用_第27张图片 其对应的service,可以对这3个实例进行负载均衡访问

华为云k8s环境部署应用_第28张图片 华为云k8s环境部署应用_第29张图片

如果要重新安装怎么办?

删掉负载,删掉服务发现,删掉命名空间ingress-nginx,然后重新来一遍。

4.nginx ingress工作原理(重要):

Nginx ingress的作用是外部访问k8s集群的接口,并且能够将不同域名的请求转发到不同的service,从而转发到不同的微服务;当然也可以将相同域名的请求,根据不同的path转发到不同的service。也就是说,可以通过域名与path的组合,将请求转发到不同的service。

1.ingress nginx controller:

它是一个pod应用(里面其实就是一个nginx),当然也是通过deploymnet controller来创建的,也创建了访问它的service

(1).Deployment controller:

(2)Service:

(3).Pod:

华为云k8s环境部署应用_第30张图片

进入这个pod之后发现,里面就是一个nginx

$ vi nginx.conf,查看这个文件发现,里面是一个一个的虚拟server(每个ingress对象对应一个虚拟server),关于ingress对象请看第2部分

华为云k8s环境部署应用_第31张图片

2.ingress对象

(1).基础概念

我们在华为云k8s中创建了多个ingress对象,每个ingress对象都对应一个nginx中的虚拟server

华为云k8s环境部署应用_第32张图片

华为云k8s环境部署应用_第33张图片

例如wit-gateway这个ingress对象

华为云k8s环境部署应用_第34张图片

华为云k8s环境部署应用_第35张图片

对应的虚拟server为:

华为云k8s环境部署应用_第36张图片

华为云k8s环境部署应用_第37张图片

(2).Ingress对象yaml解析:

yaml文件中的loadBalancer为什么是3个?

华为云k8s环境部署应用_第38张图片

因为创建了3个ingress-nginx-controller, 所以我们创建的ingress对象要写入到这3个ingress-nginx-controller中,所以上面配置了3个。 

3.怎样访问ingress nginx controller? 进而访问我们的微服务呢?

要访问到ingress-nginx-controller-75974dd6bc-rk7qb这个pod(可能有多个pod,具体看安装ingress-nginx时候的配置),才能根据ingress对象制定的路由规则访问到我们的微服务。

华为云k8s环境部署应用_第39张图片

所以看其对应的service(service应该就只有1个), 可以看到该service的对外暴露的方式是NodePort, http协议端口是30891(如下图所示:NodePort: http  30891/TCP),所以只要从集群外http协议访问任意Node:30891就可以,其endpoints是10.17.***.28:80

参考文章:Kubernetes Service NodePort 外网访问_富士康质检员张全蛋的博客-CSDN博客 

NodePort:会在每台Node上监听端口接收用户流量,在实际情况下,对用户暴露的只会有一个IP和端口,那这么多台Node该使用哪台让用户访问呢?这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。

 一般在搭建k8s集群都是放在内网当中,也就是不暴露在公网上,即使你使用了nodeport暴露了端口,但是在公网上还是访问不到的。所以必须提供公网的ip。
一般在前面加上负载均衡器来为负载均衡器提供统一的访问入口,使用负载均衡器反向代理到后面指定的端口。
一个项目对应一个service,一个service与nodeport对应。
通过nginx的虚拟主机基于域名进行分流,转发到不同的端口

upstream demo {
	server 192.168.179.103:31964;
	server 192.168.179.104:31964;
}
 
upstream demo2 {
	server 192.168.179.103:31965;
	server 192.168.179.104:31965;
}
 
upstream demo3 {
	server 192.168.179.103:31966;
	server 192.168.179.104:31966;
}
 
server {
	server_name a.xxx.com;
	location / {
		proxy_pass http://demo;
	}
}
 
server {
	server_name b.xxx.com;
	location / {
		proxy_pass http://demo2;
	}
}
 
server {
	server_name c.xxx.com;
	location / {
		proxy_pass http://demo3;
	}

5.自动化流程

上面的操作都是手动操作,自动化的流程如下图所示:

华为云k8s环境部署应用_第40张图片

6.其它基础知识:

1.ELB配置避坑:

ELB是弹性负载均衡,当我们的后端服务器没有外部访问能力的时候,需要通过配置ELB转发,将我们的请求转发到后端服务器。配置ELB的监听器的时候,到最后有个配置健康检查的地方,这个地方一定不要填端口,如果填了端口(肯定要与后端服务器端口相同),后期想要更换后端服务器端口的时候,这个健康检查端口也要跟着改,为了避免麻烦,这个地方直接空着就好了。

华为云k8s环境部署应用_第41张图片

2.Docker使用避坑:

(1).修改docker配置,docker重启后不能正常工作

目的:修改宿主机的docker服务配置,让宿主机的docker服务可以被远程访问 

#vi  /lib/systemd/system/docker.service

在配置文件中加入了"ExecStart=/usr/bin/dockerd    -H tcp://0.0.0.0:5000   -H unix:///var/run/docker.sock"

 Docker重启后,5000端口被docked占用,但是docker registry镜像仓库这个容器也要用到5000端口,导致它一直启动失败,更为严重的是,所有的微服务Pod都要从这个docker镜像仓库拉镜像,从而导致部署到这个k8s节点的Pod都启动失败。

解决方案:把这句配置去掉,然后重启docker

3.运行helloworld 镜像

使用公共docker hub,了解docker镜像下载运行

Docker安装以及运行第一个HelloWorld_韶shls的博客-CSDN博客_docker helloworld

你可能感兴趣的:(Docker与K8S,华为云,docker,kubernetes)