目录
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 镜像
参考文档:
搭建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
内网地址: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
入方向规则,有一条TCP规则允许所有客户端访问,但是端口限制在30000-32767,所以我们这里选择将docker hub的端口设置为31000.
外网访问效果:
systemctl daemon-reload
systemctl restart docker
curl -u crm:****** -XGET http://10.17.****.208:5000/v2/_catalog
列出Docker镜像仓库中所有的镜像 :
查看某个镜像(brucetest)的所有版本(tag)信息:
119.3.***.184:31000/v2/brucetest/tags/list
参看文章:(1条消息) 如何删除本地私有docker镜像仓库中的镜像_yanwei2020的博客-CSDN博客_docker删除本地镜像
使能删除功能:增加delete配置
docker exec -it fe5ce862196d vi /etc/docker/registry/config.yml
重启容器:
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
删除镜像:
利用上面得到的摘要信息,删除镜像
curl -u c***:new*** -I -X DELETE http://119.***.***.184:31000/v2/wit-component/manifests/sha256:66f7e2587a92a505b709dbd66a639218bcbf1402ca05ff59f9e3b754ee0b1da3
重点说明一下删除tag为none的镜像,批量删除tag 为none 的镜像 ,释放磁盘空间
docker rmi `docker images|grep none| awk '{print $3}'`
我们可以手动生成镜像.
Docker镜像上传和下载:
参考文档:Docker: 上传镜像至私有仓库 - SegmentFault 思否
参考文档:Docker创建镜像以及私有仓库_许你一生的远方的技术博客_51CTO博客
接下来要将生成的docker镜像上传到私有Docker镜像仓库:
给上面生成的Docker镜像 brucetest 打tag:
docker tag brucetest:1.0 10.17.*****.208:31000/brucetest:1.0(注意:这里新tag的IP地址 跟后面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
为我们的私有docker镜像仓库,创建一个秘钥,其实就是配置怎样去访问私有docker镜像仓库。
这是一个已经创建好的秘钥:
点击页面右上角的“镜像创建”
填写基本信息:
填写容器配置信息:
“镜像名称”填写我们上传到私有docker镜像仓库的镜像名字 -> 10.17.******.208:31000/brucetest:1.0;”镜像访问凭证”选择上面我们为自己的私有docker镜像仓库配置的秘钥。
服务配置:
然后,为将要创建的Pod创建一个服务service,做服务发现(为了在Pod外部访问该Pod,k8s集群或者外网)。
先配置“集群内访问”,“集群内访问”是为了实现在k8s集群内,任何一个节点都可以访问该Pod,其实就是做了Pod端口到节点端口的映射。但是此时外网是不能够访问的。
为了实现外网访问,我们需要再配置节点访问。
“服务亲和”选择集群级别,这样的话只要k8s集群中任何一个节点绑定了EIP(弹性公网IP),那么都可以实现外网访问该Pod。
查看创建的Pod(无状态负载)以及容器组:
创建好的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节点去访问创建的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。这样就能实现外网访问。
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的权限
整体流程:
重要:前端请求 -> ELB -> nginx转发器(手动部署到k8s集群中) -> ingress-nginx (外部访问k8s集群) -> service -> Pod微服务
华为云文档: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)文档中:
具体需要执行下面的指令:
kubectl apply -f deploy.yaml
deploy.yaml中定义了ingress-nginx-controller工作负载要部署到哪个节点,需要给这个节点打标签,可以通过指令,也可以通过在华为云操作界面上直接生成。
deploy.yaml资源清单文件中的定义如下,所以需要给k8s集群中相应节点(随便选一个)打标签 node = ingress-node
给节点打标签, 键为node, 值为ingress-node(也可以通过命令)
执行指令去安装nginx ingress controller:
kubectl apply -f deploy.yaml
最后生成的ingress-nginx-controller工作负载,如下:
当然了,可以创建多个实例,例如创建了3个实例
如果要重新安装怎么办?
删掉负载,删掉服务发现,删掉命名空间ingress-nginx,然后重新来一遍。
Nginx ingress的作用是外部访问k8s集群的接口,并且能够将不同域名的请求转发到不同的service,从而转发到不同的微服务;当然也可以将相同域名的请求,根据不同的path转发到不同的service。也就是说,可以通过域名与path的组合,将请求转发到不同的service。
1.ingress nginx controller:
它是一个pod应用(里面其实就是一个nginx),当然也是通过deploymnet controller来创建的,也创建了访问它的service
(1).Deployment controller:
(2)Service:
(3).Pod:
进入这个pod之后发现,里面就是一个nginx
$ vi nginx.conf,查看这个文件发现,里面是一个一个的虚拟server(每个ingress对象对应一个虚拟server),关于ingress对象请看第2部分
2.ingress对象
(1).基础概念
我们在华为云k8s中创建了多个ingress对象,每个ingress对象都对应一个nginx中的虚拟server
例如wit-gateway这个ingress对象
对应的虚拟server为:
(2).Ingress对象yaml解析:
yaml文件中的loadBalancer为什么是3个?
因为创建了3个ingress-nginx-controller, 所以我们创建的ingress对象要写入到这3个ingress-nginx-controller中,所以上面配置了3个。
3.怎样访问ingress nginx controller? 进而访问我们的微服务呢?
要访问到ingress-nginx-controller-75974dd6bc-rk7qb这个pod(可能有多个pod,具体看安装ingress-nginx时候的配置),才能根据ingress对象制定的路由规则访问到我们的微服务。
所以看其对应的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;
}
上面的操作都是手动操作,自动化的流程如下图所示:
ELB是弹性负载均衡,当我们的后端服务器没有外部访问能力的时候,需要通过配置ELB转发,将我们的请求转发到后端服务器。配置ELB的监听器的时候,到最后有个配置健康检查的地方,这个地方一定不要填端口,如果填了端口(肯定要与后端服务器端口相同),后期想要更换后端服务器端口的时候,这个健康检查端口也要跟着改,为了避免麻烦,这个地方直接空着就好了。
(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
使用公共docker hub,了解docker镜像下载运行
Docker安装以及运行第一个HelloWorld_韶shls的博客-CSDN博客_docker helloworld