kubernetes 二
部署harbor
Habor是由VMWare中国团队开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获 得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,水平扩展,同步,AD/LDAP集成以及 审计日志等。
手动部署
1.下载最新的docker-compose二进制文件
1 | [root@centos-04 ansible]# curl -L https: //github.com/docker/compose/releases/download/1.22.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose |
2.给执行权限
1 2 | [root@centos-04 ~]# chmod +x /usr/bin/docker-compose [root@centos-04 ~]# |
3.下载harbor离线安装包
1 2 3 | github地址 https: //github.com/goharbor/harbor/releases # wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0-rc3.tgz # tar zxvf harbor-offline-installer-v1.6.0-rc3.tgz |
4.准备ca证书(建议大家购买一个便宜的域名,并去申请一个免费的ssl证书)
如果不想购买域名,那就自己手动生成ca证书吧,可以参考这个文档 (https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/key.md ) 免费ssl证书 https://freessl.org/
5.安装harbor
6.创建date和crt目录
1 2 3 4 5 6 7 8 9 | # cd harbor 编辑配置文件 # vim harbor.cfg 1)定义hostname(如 harbor.yuankeedu.com) 2)定义ui_url_protocol为https 3)定义ssl_cert/ssl_key 4)定义harbor_admin_password 安装 # sh install.sh //自动安装完成 |
7.访问
1 2 | https: //harbor.yuankeedu.com admin 默认密码为 Harbor12345 |
8.创建项目
9.拉取公共镜像
1 2 | docker pull tomcat docker tag tomcat harbor.yuankeedu.com/aminglinux/tomcat:latest |
10.把tomcat镜像推送到harbor
1 2 3 | # docker login https://harbor.yuankeedu.com 输入用户名和密码 # docker push harbor.yuankeedu.com/aminglinux/tomcat:latest |
扩展: 镜像复制,参考 https://blog.csdn.net/aixiaoyang168/article/details/73549898 问题: x509: certificate signed by unknown authority
1 2 3 | 1) echo -n | openssl s_client -showcerts -connect harbor.yuankeedu.com:443 2>/dev/ null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> /etc/ssl/certs/ca-bundle.trust.crt 2)systemctl restart docker |
如果以上步骤无法解决该问题,尝试使用以下步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # mkdir -p /etc/docker/certs.d/harbor.yuankeedu.com # vim /etc/docker/certs.d/harbor.yuankeedu.com/ca.crt //内容如下(注意,这个只针对harbor.yuankedu.com域名的,这个 其实就是免费的ca证书压缩包里的ca文件内容) -----BEGIN CERTIFICATE----- MIIErjCCA5agAwIBAgIQBYAmfwbylVM0jhwYWl7uLjANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0xNzEyMDgxMjI4MjZaFw0yNzEyMDgxMjI4MjZaMHIxCzAJBgNVBAYTAkNO MSUwIwYDVQQKExxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQL ExREb21haW4gVmFsaWRhdGVkIFNTTDEdMBsGA1UEAxMUVHJ1c3RBc2lhIFRMUyBS U0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWa9X+ph+wAm8 Yh1Fk1MjKbQ5QwBOOKVaZR/OfCh+F6f93u7vZHGcUU/lvVGgUQnbzJhR1UV2epJa e+m7cxnXIKdD0/VS9btAgwJszGFvwoqXeaCqFoP71wPmXjjUwLT70+qvX4hdyYfO JcjeTz5QKtg8zQwxaK9x4JT9CoOmoVdVhEBAiD3DwR5fFgOHDwwGxdJWVBvktnoA zjdTLXDdbSVC5jZ0u8oq9BiTDv7jAlsB5F8aZgvSZDOQeFrwaOTbKWSEInEhnchK ZTD1dz6aBlk1xGEI5PZWAnVAba/ofH33ktymaTDsE6xRDnW97pDkimCRak6CEbfe 3dXw6OV5AgMBAAGjggFPMIIBSzAdBgNVHQ4EFgQUf9OZ86BHDjEAVlYijrfMnt3K AYowHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQD AgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAG AQH/AgEAMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au ZGlnaWNlcnQuY29tMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2lj ZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwTAYDVR0gBEUwQzA3Bglg hkgBhv1sAQIwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29t L0NQUzAIBgZngQwBAgEwDQYJKoZIhvcNAQELBQADggEBAK3dVOj5dlv4MzK2i233 lDYvyJ3slFY2X2HKTYGte8nbK6i5/fsDImMYihAkp6VaNY/en8WZ5qcrQPVLuJrJ DSXT04NnMeZOQDUoj/NHAmdfCBB/h1bZ5OGK6Sf1h5Yx/5wR4f3TUoPgGlnU7EuP ISLNdMRiDrXntcImDAiRvkh5GJuH4YCVE6XEntqaNIgGkRwxKSgnU3Id3iuFbW9F UQ9Qqtb1GX91AJ7i4153TikGgYCdwYkBURD8gSVe8OAco6IfZOYt/TEwii1Ivi1C qnuUlWpsF1LdQNIdfbW3TSe0BhQa7ifbVIfvPWHYOu3rkg1ZeMo6XRU9B4n5VyJY RmE= # chmod 400 /etc/docker/certs.d/harbor.yuankeedu.com/ca.crt # systemctl restart docker |
kubernetes中使用harbor
以下操作在master上执行:
创建secret
1 2 | # kubectl create secret docker-registry my-secret --docker-server=harbor.yuankeedu.com --dockerusername=admin --docker-password=Harbor12345 |
创建完成后,可以用以下命令查看:
1 | kubectl get secret |
定义一个pod 首先,需要在harbo私有仓库里推送一个httpd的镜像,地址为harbor.yuankeedu.com/aminglinux/httpd:latest
1 2 3 4 | # docker pull httpd # docker tag httpd harbor.yuankeedu.com/aminglinux/httpd:latest # docker login https://harbor.yuankeedu.com # docker push |
然后再定义yaml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | # vim httpd.yaml //内容如下 apiVersion: v1 kind: Pod metadata: name: httpd-pod spec: containers: - image: harbor.yuankeedu.com/aminglinux/httpd:latest name: httpd-pod imagePullSecrets: - name: my-secret # kubectl create -f httpd.yaml # kubectl describe pod httpd-pod //查看pod创建过程的信息,可能会存在问题 |
二. 利用kubeasz项目部署(1.6.0版本的harbor并未实验成功,大家可以尝试做一下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 1)下载docker-compose二进制文件,改名后把它放到项目/etc/ansible/bin/目录下 wget https: //github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64 mv docker-compose-Linux-x86_64 /etc/ansible/bin/docker-compose 2)下载habor安装文件 github地址 https: //github.com/goharbor/harbor/releases wget https: //storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0-rc3.tgz 3)由于ansible解压的一些问题,需要将官方的tgz包,重新打包为zip包 tar zxf harbor-offline-installer-v1.6.0-rc3.tgz zip -r harbor-offline-installer-v1.6.0-rc3.zip harbor mv harbor-offline-installer-v1.6.0-rc3.zip /etc/ansible/down/harbor-offline-installer-v1.6.0.zip 4)在deploy节点编辑/etc/ansible/hosts文件 5)在deploy节点执行 vim /etc/ansible/roles/harbor/defaults/main.yml //修改版本号 ansible-playbook /etc/ansible/11.harbor.yml |
kubernetes中使用NFS创建pv_pvc
kubernetes中使用NFS作为共享存储 Persistent Volume(持久化卷)简称PV, 是一个K8S资源对象,我们可以单独创建一个PV, 它不和Pod直接发生关系, 而是通过 Persistent Volume Claim, 简称PVC来实现动态绑定, 我们会在Pod定义里指定创建好的PVC, 然后PVC会根据Pod的要求去自 动绑定合适的PV给Pod使用。 持久化卷下PV和PVC概念: Persistent Volume(PV)是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资 源。 PV 是 Volume 之类的卷插件,但具有独立于使用 PV 的 Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS、 iSCSI 或特定于云供应商的存储系统。 PersistentVolumeClaim(PVC)是用户存储的请求。它与 Pod 相似,Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以 请求特定级别的资源(CPU 和内存)。PVC声明可以请求特定的大小和访问模式(例如,可以以读/写一次或只读多次模式挂 载)。 它和普通Volume的区别是什么呢? 普通Volume和使用它的Pod之间是一种静态绑定关系,在定义Pod的文件里,同时定义了它使用的Volume。Volume是Pod 的附属品,我们无法单独创建一个Volume,因为它不是一个独立的K8S资源对象。
1.准备一台机器,搭建NFS服务
1 | yum install nfs-utils |
1 | [root@centos-04 ~]# vim /etc/exportfs |
1 | /data/k8s/ 172.7.15.0/24(sync,rw,no_root_squash)(node节点的ip段) |
1 2 | systemctl start nfs systemctl enable nfs |
在node节点上测试
1 2 | yum install nfs-utils showmount -e 172.7.15.113 |
3 创建pv(master上)
1 2 3 4 5 6 7 8 9 10 11 12 13 | vim mypv.yaml //内容如下 apiVersion: v1 kind: PersistentVolume metadata: name: pv001 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /data/k8s/ server: 172.7.15.113 |
1 2 3 4 5 | kubectl create -f mypv.yaml kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv001 10Gi RWX Retain Available 10m 状态为Available,这是因为它还没有绑定到任何的pvc上面,当定义完pvc后,就可以自动绑定了 |
创建pvc(master上)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | vim mypvc.yaml //内容如下 kind: PersistentVolumeClaim apiVersion: v1 metadata: name: myclaim spec: accessModes: - ReadWriteMany resources: requests: storage: 8Gi kubectl create -f mypvc.yaml kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE myclaim Bound pv001 10Gi RWX 2m 可以看到,pvc状态为Bound,它绑定了pv001 |
定义pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | vim pvpod.yaml //内容如下 apiVersion: v1 kind: Pod metadata: name: httpd-pvpod spec: containers: - image: httpd name: httpd-withpvc-pod imagePullPolicy: Always volumeMounts: - mountPath: "/usr/local/apache2/htdocs/" name: httpd-volume volumes: - name: httpd-volume persistentVolumeClaim: claimName: myclaim |
kubectl create -f pvpod.yaml kubectl describe pod httpd-pvpod //查看Volumes那部分里的ClaimName
6 验证 1)到NFS的共享目录下创建一个文件 cd /data/k8s/ echo "Test file" > 1.html 2)进入到httpd-pod里 kubectl exec -it httpd-pvpod bash cat /usr/local/apache2/htdocs/1.html 3)删除httpd-pvpod kubectl delete pod httpd-pod cat /data/k8s/1.html 4)重建httpd-pod kubectl create -f pvpod.yaml 5)curl访问
kubectl get pod httpd-pvpod -o wide //查看其对应的IP NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE httpd-pod 1/1 Running 0 2m 172.20.3.5 172.7.15.114 curl 172.20.3.5/1.html 参考 http://www.showerlee.com/archives/2280
在kubernetes中部署LNMP并运行Discuz上
文档整理 https://coding.net/u/aminglinux/p/k8s_discuz/git/tree/master
下载MySQL、PHP以及Nginx镜像
1 | [root@centos-04 ~]# docker pull mysql:5.7 |
1 | [root@centos-04 ~]# docker pull richarvey/nginx-php-fpm |
克隆本项目
git clone https://git.coding.net/aminglinux/k8s_discuz.git
进入到项目目录
1 2 | [root@centos-04 ~]# cd k8s_discuz/dz_web_dockerfile/ [root@centos-04 dz_web_dockerfile]# |
1 | docker build -t nginx-php . |
将下载到的镜像push到harbor
1 2 3 4 5 6 | ##登录harbor,并push新的镜像 docker login harbor.yuankeedu.com //输入正确的用户名和密码 docker tag nginx-php harbor.yuankeedu.com/aminglinux/nginx-php docker push harbor.yuankeedu.com/aminglinux/nginx-php docker tag mysql:5.7 harbor.yuankeedu.com/aminglinux/mysql:5.7 docker push harbor.yuankeedu.com/aminglinux/mysql:5.7 |
搭建NFS
假设kubernetes集群网段为172.7.5.0/24,本机IP为172.7.5.13
1 2 3 4 5 6 | yum install nfs-utils vim /etc/exportfs //内容如下 /data/k8s/ 172.7.5.0/24(sync,rw,no_root_squash) systemctl start nfs systemctl enable nfs mkdir -p /data/k8s/discuz/{db,web} |
搭建MySQL服务
创建secret (设定mysql的root密码)
1 | kubectl create secret generic mysql-pass -- from -literal=password=DzPasswd1 |
创建pv(修改里面的ip为自己的)
1 2 | cd ../../k8s_discuz/mysql kubectl create -f mysql-pv.yaml |
创建pvc
1 | kubectl create -f mysql-pvc.yaml |
创建deployment
1 | kubectl create -f mysql-dp.yaml |
创建service
1 | kubectl create -f mysql-svc.yaml |
在kubernetes中部署LNMP并运行Discuz中
搭建Nginx+php-fpm服务
搭建pv
1 2 | cd ../../k8s_discuz/nginx_php kubectl create -f web-pv.yaml(修改ip) |
创建pvc
1 | kubectl create -f web-pvc.yaml |
创建deployment
1 | kubectl create -f web-dp.yaml |
创建service
1 | kubectl create -f web-svc.yaml(这里面有一个80端口) |
在kubernetes中部署LNMP并运行Discuz下
安装Discuz
下载dz代码 (到NFS服务器上)
1 2 3 4 5 | cd /tmp/ git clone https: //gitee.com/ComsenzDiscuz/DiscuzX.git cd /data/k8s/discuz/web/ mv /tmp/DiscuzX/upload/* . chown -R 100 data uc_server/data/ uc_client/data/ config/ |
设置MySQL普通用户
1 2 3 4 | kubectl get svc dz-mysql //查看service的cluster-ip,我的是10.68.122.120 mysql -uroot -h10.68.122.120 -pDzPasswd1 //这里的密码是在上面步骤中设置的那个密码 > create database dz; > grant all on dz.* to 'dz' @ '%' identified by 'dz-passwd-123' ; |
如果想用浏览器访问需要更改
浏览器访问
如果不想带30001端口需要做代理
安装nginx
编辑配置文件
绑定hosts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 注意:目前nginx服务是运行在kubernetes集群里,node节点以及master节点上是可以通过cluster-ip访问到,但是外部的客户端就不能访问了。 所以,可以在任意一台node或者master上建一个nginx反向代理即可访问到集群内的nginx。 kubectl get svc dz-web //查看cluster-ip,我的ip是10.68.190.99 nginx代理配置文件内容如下: server { listen 80; server_name dz.yuankeedu.com; location / { proxy_pass http: //10.68.190.99:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } |
安装Discuz
1 | 做完Nginx代理,就可以通过node的IP来访问discuz了。 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp