Habor是由VMWare中國團隊開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而獲 得了更加普遍的應用,這些新的企業級特性包括:管理用戶界面,基於角色的訪問控制 ,水平擴展,同步,AD/LDAP集成以及 審計日誌等。php
手動部署html
1.下載最新的docker-compose二進制文件node
[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.給執行權限mysql
[root@centos-04 ~]# chmod +x /usr/bin/docker-compose [root@centos-04 ~]#
3.下載harbor離線安裝包linux
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證書)nginx
若是不想購買域名,那就本身手動生成ca證書吧,能夠參考這個文檔 (https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/key.md ) 免費ssl證書 https://freessl.org/ git
5.安裝harborgithub
6.建立date和crt目錄web
# 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.訪問sql
https://harbor.yuankeedu.com admin 默認密碼爲 Harbor12345
8.建立項目
9.拉取公共鏡像
docker pull tomcat docker tag tomcat harbor.yuankeedu.com/aminglinux/tomcat:latest
10.把tomcat鏡像推送到harbor
# 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) 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
若是以上步驟沒法解決該問題,嘗試使用如下步驟
# 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
如下操做在master上執行:
建立secret
# kubectl create secret docker-registry my-secret --docker-server=harbor.yuankeedu.com --dockerusername=admin --docker-password=Harbor12345
建立完成後,能夠用如下命令查看:
kubectl get secret
定義一個pod 首先,須要在harbo私有倉庫裏推送一個httpd的鏡像,地址爲harbor.yuankeedu.com/aminglinux/httpd:latest
# docker pull httpd # docker tag httpd harbor.yuankeedu.com/aminglinux/httpd:latest # docker login https://harbor.yuankeedu.com # docker push
而後再定義yaml文件
# 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)下載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做爲共享存儲 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服務
yum install nfs-utils
[root@centos-04 ~]# vim /etc/exportfs
/data/k8s/ 172.7.15.0/24(sync,rw,no_root_squash)(node節點的ip段)
systemctl start nfs systemctl enable nfs
在node節點上測試
yum install nfs-utils showmount -e 172.7.15.113
3 建立pv(master上)
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
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上)
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
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
文檔整理 https://coding.net/u/aminglinux/p/k8s_discuz/git/tree/master
下載MySQL、PHP以及Nginx鏡像
[root@centos-04 ~]# docker pull mysql:5.7
[root@centos-04 ~]# docker pull richarvey/nginx-php-fpm
克隆本項目
git clone https://git.coding.net/aminglinux/k8s_discuz.git
進入到項目目錄
[root@centos-04 ~]# cd k8s_discuz/dz_web_dockerfile/ [root@centos-04 dz_web_dockerfile]#
docker build -t nginx-php .
##登陸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
假設kubernetes集羣網段爲172.7.5.0/24,本機IP爲172.7.5.13
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}
建立secret (設定mysql的root密碼)
kubectl create secret generic mysql-pass --from-literal=password=DzPasswd1
建立pv(修改裏面的ip爲本身的)
cd ../../k8s_discuz/mysql kubectl create -f mysql-pv.yaml
建立pvc
kubectl create -f mysql-pvc.yaml
建立deployment
kubectl create -f mysql-dp.yaml
建立service
kubectl create -f mysql-svc.yaml
搭建pv
cd ../../k8s_discuz/nginx_php
kubectl create -f web-pv.yaml(修改ip)
建立pvc
kubectl create -f web-pvc.yaml
建立deployment
kubectl create -f web-dp.yaml
建立service
kubectl create -f web-svc.yaml(這裏面有一個80端口)
下載dz代碼 (到NFS服務器上)
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普通用戶
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
注意:目前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
作完Nginx代理,就能夠經過node的IP來訪問discuz了。