该测试基于上篇集群环境下演示: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访问):

https://hub.atguigu.com/

用户名默认是: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 中有以下四种类型:

  1. ClusterIp
  2. NodePort
  3. LoadBalancer
  4. 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的结果可以总结出如下观点:

  1. pod是可以单独创建并进行生命周期管理的;
  2. 单独创建pod的时候就不会有deployment出现,但是创建deployment的时候一定会创建pod, 创建Deployment的过程就是创建pod的过程,因为pod是一个基础的单位。
  3. 如果在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

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐