配置harbor私有仓库以及演示k8s集群功能
该测试基于上篇集群环境下演示:https://blog.csdn.net/Doudou_Mylove/article/details/103901732harbor构建#单独再开一台服务器:10.12.237.20,并且修改主机名:hostnamectl set-hostname hub.atguigu.com1、安装docker参照:https://blog.csdn.net/Doudou_My
该测试基于上篇集群环境下演示:https://blog.csdn.net/Doudou_Mylove/article/details/103901732
harbor构建
#单独再开一台服务器:10.12.237.20,并且修改主机名:
hostnamectl set-hostname hub.atguigu.com
1、安装docker
参照:https://blog.csdn.net/Doudou_Mylove/article/details/103901732
2、安装docker-compose
#版本要大于1.6.x以上
yum -y install epel-release
yum -y install python-pip
pip --version
pip install --upgrade pip
yum install python-devel -y
pip install docker-compose==1.24.0
pip uninstall urllib3 -y
pip uninstall chardet -y
pip install requests
3、安装harbor
wget http://harbor.orientsoft.cn/harbor-1.2.0/harbor-offline-installer-v1.2.0.tgz
tar xf harbor-offline-installer-v1.2.0.tgz
cd harbor/
#修改配置文件
vim harbor.cfg
#修改如下两行
#第一行指定的域名就是下面将会修改/etc/docker/daemon.json文件中新增的地址
hostname = hub.atguigu.com
ui_url_protocol = https
#这里一定要注意hostname = hub.atguigu.com要单独只有一行,我一开始习惯性的把原来的注释掉新加了一行结果后面执行脚本./install 的时候一直报错如下:
[root@localhost harbor]# ./install.sh
? Please set hostname and other necessary attributes in harbor.cfg first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.cfg bacause notary must run under https.
Please set --with-clair if needs enable Clair in Harbor
#根据配置文件提供的证书存放路径创建目录并创建https证书
mkdir -p /data/cert
cd /data/cert/
#首先生成一个私钥并输入密码
openssl genrsa -des3 -out server.key 2048
#然后创建证书的请求csr,这一步开头就会让你输入上面设置的密码
openssl req -new -key server.key -out server.csr
#私钥做个备份
cp server.key server.key.org
#退掉私钥的密码,需要输入开头创建私钥时的密码
openssl rsa -in server.key.org -out server.key
#最后用证书请求scr做签名生成证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
#给证书执行权限
chmod -R 777 /data/cert
#修改/etc/hosts文件,四台服务器要一致
vim /etc/hosts
10.12.237.17 k8s-master
10.12.237.18 k8s-node2
10.12.237.19 k8s-node1
10.12.237.20 hub.atguigu.com
#修改daemon.json文件添加了如下标红部分的内容:
[root@localhost ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":{
"max-size": "100m"
},
"insecure-registries": ["https://hub.atguigu.com"]
}
含义:默认的docker仓库是用https访问,为了演示效果使用我们自制的证书,所以要告诉docker我们这个仓库的地址是安全的。目的就是后续在k8s集群中会用到docker login https://hub.atguigu.com登录私有仓库来快速调用和管理镜像。
#运行脚本进行安装 ./install.sh
#最后浏览器登录验证:
验证之前需在本机host文件做域名映射,这样才能使用harbor.cfg文件中设置的域名访问
打开C:\Windows\System32\drivers\etc下的hosts加入下面一行
10.12.237.20 hub.atguigu.com
访问域名(因为我们做了证书所以要用https访问):
用户名默认是:admin
密码在harbor.cfg配置文件中默认是:Harbor12345
#因为我们用的是自创的证书,所以会提示不安全,只需要点击高级继续连接即可:
docker登录harbor测试
#可使用k8s集群中的任意一台
登录命令:docker login https://hub.atguigu.com
按提示输入用户名和密码,如下表示登录成功。
#从本地推送一个镜像测试
可从harbor主页面中的library仓库进去查看推送镜像规则:要先打标签再推送
标记样例:
docker tag SOURCE_IMAGE[:TAG] hub.atguigu.com/library/IMAGE[:TAG]
推送样例:
docker push hub.atguigu.com/library/IMAGE[:TAG]
我们就用master节点中的flannel镜像测试:
打标记:
docker tag quay.io/coreos/flannel:v0.12.0-amd64 hub.atguigu.com/library/flannel:v1
推送:
docker push hub.atguigu.com/library/flannel:v1
回到harbor仓库查看镜像推送成功:
4、测试k8s集群是否可连接使用harbor
这时候我们需要push一个集群中不存在并且可用来启动一个pod的镜像,比如nginx,创建镜像可参考文档:https://blog.csdn.net/Doudou_Mylove/article/details/92799924
创建好镜像之后还在master节点操作push镜像到harbor仓库:
docker tag lijunmin/nginx:latest hub.atguigu.com/library/nginx:v1
docker push hub.atguigu.com/library/nginx:v1
#演示完成记得删除测试镜像:
docker rmi -f hub.atguigu.com/library/flannel:v1
docker rmi -f lijunmin/nginx:latest
docker rmi -f hub.atguigu.com/library/nginx:v1
docker rmi -f centos:latest
创建一个Deployment
#run后面是pod名称,并指定了镜像(--image),暴露端口(--port,这里不是-P指定端口的意思,因为docker是扁平化网络,这里不指定也是可以访问80端口的),设置副本数(--replicas)
kubectl run nginx-deployment --image=hub.atguigu.com/library/nginx:v1 --port=80 --replicas=1
#此种方式仅仅是为了演示集群功能,在现实生产中一定要使用资源清单的方式创建deployment、pod、svc等,具体请看下篇文档《k8s的资源清单使用》
#运行完成后可以看到harbor仓库所用的镜像下载次数变成了1
启动完成后可查看deployment,rs,pod
如下查看pod详细信息,pod运行在节点node1上,配置的IP为10.244.1.2
在node1查看网络接口,多了一个cni0和veth的虚拟设备:
#当有容器运行后,在运行该pod的节点上多了个虚拟接口cni0,其IP为10.244.1.1,它是由flanneld创建的一个虚拟网桥叫cni0,在pod本地通信使用。
#flanneld为每个pod创建一对veth虚拟设备,一端放在容器接口上,一端放在cni0桥上。
去node2节点查看:除了原始的proxy和flannel以外多两个一个nginx-deployment和pause的容器
副本数扩容-scale
语法:
$ scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
kubectl scale --replicas=3 deployment/nginx-deployment
kubectl expose
将资源暴露为新的Kubernetes Service
语法:
$ expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type]
目标端口暴露为30000
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
查看service(SVC)
Kubernetes---Service(SVC)服务
#Kubernetes Service定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector(标签选择器)
Service 在 K8s 中有以下四种类型:
- ClusterIp
- NodePort
- LoadBalancer
- ExternalName
ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP【service创建一个仅集群内部可访问的ip,集群内部其他的pod可以通过该服务访问到其监控下的pod】
从kubectl get svc可以看出集群通过expose给nginx-deployment服务暴露为一个新svcb并且自动分配了一个IP为10.105.58.50,端口为暴漏的30000,通过这个IP+端口可以在集群的任意节点访问该服务
svc之ipvs cluster ip负载均衡实现
SVC通过ipvs调度内核模块实现了访问cluster IP的负载均衡机制。
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个IP 地址上显示为虚拟服务。
当我们在集群中master节点多次执行curl ClusterIP+端口访问svc服务时就可以使用ipvsadm查看负载规则以及转发的次数。
ipvsadm -Ln
Kubernetes-SVC之NodePort
#通过NodePort向k8s集群外部暴露SVC服务
kubectl edit services nginx-deployment
#修改type类型由默认的ClusterIp为NodePort
再查看svc发现对应的30000端口暴露出一个对外访问的端口30549
最后使用集群中任意节点的真实IP+对外暴露的端口进行浏览器访问:
pod与deployment创建的关系
从上面查看deployment,rs,pod的结果可以总结出如下观点:
- pod是可以单独创建并进行生命周期管理的;
- 单独创建pod的时候就不会有deployment出现,但是创建deployment的时候一定会创建pod, 创建Deployment的过程就是创建pod的过程,因为pod是一个基础的单位。
- 如果在Deployment中指定replicas=1,那这个Deployment创建之后就启动一个pod,但是,如果你想启动多个pod用于增强负载能力的,可直接设置replicas=n,那Deployment创建成功后,就直接起n个pod。
修改nginx首页内容
#主页内容是push到harbor仓库之前修改的;
修改流程:
docker pull nginx
docker run -it -d --name nginx_new_test nginx:latest
#docker run -it -d --name test_app hub.atguigu.com/library/nginx:v1
#进入容器修改首页内容
docker exec -it nginx_new_test /bin/bash
echo “this is nginx V2”/usr/share/nginx/html/index.html
#重构镜像
docker commit nginx_new_test nginx:v2
#上传到harbor仓库
docker tag nginx:v2 hub.atguigu.com/library/nginx:V2
docker push hub.atguigu.com/library/nginx:V2
更多推荐
所有评论(0)