黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持續集成交付環境的詳細教程

瀏覽:251日期:2024-10-28 08:41:40
目錄環境搭建概述1.K8S是什么?2.為什么要用K8S?3.使用K8S有哪些好處?4.環境構成安裝Docker環境安裝docker-compose1.下載docker-compose文件2.為docker-compose文件賦予可執行權限3.查看docker-compose版本安裝K8S集群環境安裝K8S基礎環境初始化Master節點1.初始化Master節點的網絡環境2.初始化Master節點3.查看Master節點的初始化結果初始化Worker節點1.獲取join命令參數2.初始化Worker節點3.查看初始化結果重啟K8S集群引起的問題1.Worker節點故障不能啟動2.Pod崩潰或不能正常訪問K8S安裝ingress-nginx1.創建ingress-nginx命名空間2.安裝ingress controller3.安裝K8S SVC:ingress-nginx4.訪問K8S SVC:ingress-nginxK8S安裝gitlab代碼倉庫1.創建k8s-ops命名空間2.安裝gitlab-redis3.安裝gitlab-postgresql4.安裝gitlab5.安裝完成安裝Harbor私有倉庫1.下載Harbor的離線安裝版本2.解壓Harbor的安裝包3.配置Harbor4.安裝并啟動harbor5.登錄Harbor并添加賬戶6.修改Harbor端口安裝Jenkins(一般的做法)1.安裝nfs(之前安裝過的話,可以省略此步)2.創建nfs共享目錄3.創建PV4.創建serviceAccount5.安裝Jenkins6.創建Service7.安裝 ingress物理機安裝SVN1.使用yum安裝SVN2.創建SVN庫3.配置SVN4.啟動SVN服務Docker安裝SVN物理機安裝Jenkins1.啟用Jenkins庫2.安裝Jenkins3.啟動Jenkins配置Jenkins運行環境1.登錄Jenkins2.安裝插件3.配置JenkinsJenkins發布Docker項目到K8s集群1.調整SpringBoot項目的配置2.Jenkins配置發布項目環境搭建概述

親愛的家人們可以到鏈接:http://xiazai.jb51.net/202105/yuanma/javayaml_jb51.rar 下載所需要的yaml文件。

1.K8S是什么?

K8S全稱是Kubernetes,是一個全新的基于容器技術的分布式架構領先方案,基于容器技術,目的是實現資源管理的自動化,以及跨多個數據中心的資源利用率的最大化。

如果我們的系統設計遵循了kubernetes的設計思想,那么傳統系統架構中那些和業務沒有多大關系的底層代碼或功能模塊,都可以使用K8S來管理,我們不必再費心于負載均衡的選型和部署實施問題,不必再考慮引入或自己開發一個復雜的服務治理框架,不必再頭疼與服務監控和故障處理模塊的開發??傊褂胟ubernetes提供的解決方案,會大大減少開發成本,同時可以將精力更加集中于業務本身,而且由于kubernetes提供了強大的自動化機制,所以系統后期的運維難度和運維成本大幅降低。

2.為什么要用K8S?

Docker 這個新興的容器化技術當前已經被很多公司所采用,其從單機走向集群已成必然,而云計算的蓬勃發展正在加速這一進程。Kubernetes 作為當前唯一被業界廣泛認可和看好的 Docker 分布式系統解決方案。可以預見,在未來幾年內,會有大量的新系統選擇它,不管是運行在企業本地服務器上還是被托管到公有云上。

3.使用K8S有哪些好處?

使用Kubernetes就是在全面部署微服務架構。微服務架構的核心就是將一個巨大的單體應用分解為很多小的互相連接的微服務,一個微服務背后可能有多個實例副本在支撐,副本的數量可能會隨著系統的負荷變化而進行調整,內嵌的負載均衡器在 k8s 平臺中有多個實例副本在支撐,副本的數量可能會隨著系統的負荷變化而進行調整,內嵌的負載均衡器 在k8s 平臺中發揮了重要的作用。微服務架構使得每個服務都可以由專門的開發團隊來開發,開發者可以自由選擇開發技術,這對于大規模團隊來說很有價值。另外,每個微服務獨立開發、升級、擴展,使得系統具備很高的穩定性和快速迭代進化能力。

4.環境構成

整套環境的搭建包含:Docker環境的搭建、docker-compose環境的搭建、K8S集群的搭建、GitLab代碼倉庫的搭建、SVN倉庫的搭建、Jenkins自動化部署環境的搭建、Harbor私有倉庫的搭建。

本文檔中,整套環境的搭建包括:

安裝Docker環境 安裝docker-compose 安裝K8S集群環境 重啟K8S集群引起的問題 K8S安裝ingress-nginx K8S安裝gitlab代碼倉庫 安裝Harbor私有倉庫 安裝Jenkins 物理機安裝SVN(推薦) 物理機安裝Jenkins(推薦) 配置Jenkins運行環境 Jenkins發布Docker項目到K8S

服務器規劃

IP 主機名 節點 操作系統 192.168.0.10 test10 K8S Master CentOS 8.0.1905 192.168.0.11 test11 K8S Worker CentOS 8.0.1905 192.168.0.12 test12 K8S Worker CentOS 8.0.1905

安裝環境

軟件名稱 軟件版本 說明 Docker 19.03.8 提供容器環境 docker-compose 1.25.5 定義和運行由多個容器組成的應用 K8S 1.18.2 是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。 GitLab 12.1.6 代碼倉庫 Harbor 1.10.2 私有鏡像倉庫 Jenkins 2.222.3 持續集成交付

安裝Docker環境

Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。

Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。

本文檔基于Docker 19.03.8 版本搭建Docker環境。

在所有服務器上創建install_docker.sh腳本,腳本內容如下所示。

#使用阿里云鏡像中心export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com#安裝yum工具dnf install yum*#安裝docker環境yum install -y yum-utils device-mapper-persistent-data lvm2#配置Docker的yum源yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安裝容器插件dnf install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm#指定安裝docker 19.03.8版本yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8#設置Docker開機啟動systemctl enable docker.service#啟動Dockersystemctl start docker.service#查看Docker版本docker version

在每臺服務器上為install_docker.sh腳本賦予可執行權限,并執行腳本,如下所示。

# 賦予install_docker.sh腳本可執行權限chmod a+x ./install_docker.sh# 執行install_docker.sh腳本./install_docker.sh安裝docker-compose

Compose 是用于定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務。然后,使用一個命令,就可以從 YML 文件配置中創建并啟動所有服務。

注意:在每臺服務器上安裝docker-compose

1.下載docker-compose文件

#下載并安裝docker-composecurl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.為docker-compose文件賦予可執行權限

#賦予docker-compose可執行權限chmod a+x /usr/local/bin/docker-compose3.查看docker-compose版本

#查看docker-compose版本[root@binghe ~]# docker-compose versiondocker-compose version 1.25.5, build 8a1c60f6docker-py version: 4.1.0CPython version: 3.7.5OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019安裝K8S集群環境

Kubernetes是一個開源的,用于管理云平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單并且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。

本文檔基于K8S 1.8.12版本來搭建K8S集群

安裝K8S基礎環境

在所有服務器上創建install_k8s.sh腳本文件,腳本文件的內容如下所示。

#################配置阿里云鏡像加速器開始########################mkdir -p /etc/dockertee /etc/docker/daemon.json <<-’EOF’{ 'registry-mirrors': ['https://zz3sblpi.mirror.aliyuncs.com']}EOFsystemctl daemon-reloadsystemctl restart docker######################配置阿里云鏡像加速器結束##########################安裝nfs-utilsyum install -y nfs-utils#安裝wget軟件下載命令yum install -y wget#啟動nfs-serversystemctl start nfs-server#配置nfs-server開機自啟動systemctl enable nfs-server#關閉防火墻systemctl stop firewalld#取消防火墻開機自啟動systemctl disable firewalld#關閉SeLinuxsetenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config# 關閉 swapswapoff -ayes | cp /etc/fstab /etc/fstab_bakcat /etc/fstab_bak |grep -v swap > /etc/fstab############################修改 /etc/sysctl.conf開始############################ 如果有配置,則修改sed -i 's#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g' /etc/sysctl.confsed -i 's#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g' /etc/sysctl.confsed -i 's#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g' /etc/sysctl.confsed -i 's#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g' /etc/sysctl.confsed -i 's#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g' /etc/sysctl.confsed -i 's#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g' /etc/sysctl.confsed -i 's#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g' /etc/sysctl.conf# 可能沒有,追加echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.confecho 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.confecho 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.confecho 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.confecho 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.confecho 'net.ipv6.conf.lo.disable_ipv6 = 1' >> /etc/sysctl.confecho 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.conf############################修改 /etc/sysctl.conf結束############################ 執行命令使修改后的/etc/sysctl.conf文件生效sysctl -p################# 配置K8S的yum源開始#############################cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF################# 配置K8S的yum源結束############################## 卸載舊版本K8Syum remove -y kubelet kubeadm kubectl# 安裝kubelet、kubeadm、kubectl,這里我安裝的是1.18.2版本,你也可以安裝1.17.2版本yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2# 修改docker Cgroup Driver為systemd# # 將/usr/lib/systemd/system/docker.service文件中的這一行 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock# # 修改為 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd# 如果不修改,在添加 worker 節點時可能會碰到如下錯誤# [WARNING IsDockerSystemdCheck]: detected 'cgroupfs' as the Docker cgroup driver. The recommended driver is 'systemd'. # Please follow the guide at https://kubernetes.io/docs/setup/cri/sed -i 's#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g' /usr/lib/systemd/system/docker.service# 設置 docker 鏡像,提高 docker 鏡像下載速度和穩定性# 如果訪問 https://hub.docker.io 速度非常穩定,也可以跳過這個步驟,一般不需配置# curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}# 重新加載配置文件systemctl daemon-reload#重啟 dockersystemctl restart docker# 將kubelet設置為開機啟動并啟動kubeletsystemctl enable kubelet && systemctl start kubelet# 查看docker版本docker version

在每臺服務器上為install_k8s.sh腳本賦予可執行權限,并執行腳本

# 賦予install_k8s.sh腳本可執行權限chmod a+x ./install_k8s.sh# 運行install_k8s.sh腳本./install_k8s.sh初始化Master節點

只在test10服務器上執行的操作。

1.初始化Master節點的網絡環境

注意:下面的命令需要在命令行手動執行。

# 只在 master 節點執行# export 命令只在當前 shell 會話中有效,開啟新的 shell 窗口后,如果要繼續安裝過程,請重新執行此處的 export 命令export MASTER_IP=192.168.0.10# 替換 k8s.master 為 您想要的 dnsNameexport APISERVER_NAME=k8s.master# Kubernetes 容器組所在的網段,該網段安裝完成后,由 kubernetes 創建,事先并不存在于物理網絡中export POD_SUBNET=172.18.0.1/16echo '${MASTER_IP} ${APISERVER_NAME}' >> /etc/hosts2.初始化Master節點

在test10服務器上創建init_master.sh腳本文件,文件內容如下所示。

#!/bin/bash# 腳本出錯時終止執行set -eif [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then echo -e '033[31;1m請確保您已經設置了環境變量 POD_SUBNET 和 APISERVER_NAME 033[0m' echo 當前POD_SUBNET=$POD_SUBNET echo 當前APISERVER_NAME=$APISERVER_NAME exit 1fi# 查看完整配置選項 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2rm -f ./kubeadm-config.yamlcat <<EOF > ./kubeadm-config.yamlapiVersion: kubeadm.k8s.io/v1beta2kind: ClusterConfigurationkubernetesVersion: v1.18.2imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerscontrolPlaneEndpoint: '${APISERVER_NAME}:6443'networking: serviceSubnet: '10.96.0.0/16' podSubnet: '${POD_SUBNET}' dnsDomain: 'cluster.local'EOF# kubeadm init# 初始化kebeadmkubeadm init --config=kubeadm-config.yaml --upload-certs# 配置 kubectlrm -rf /root/.kube/mkdir /root/.kube/cp -i /etc/kubernetes/admin.conf /root/.kube/config# 安裝 calico 網絡插件# 參考文檔 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremisesecho '安裝calico-3.13.1'rm -f calico-3.13.1.yamlwget https://kuboard.cn/install-script/calico/calico-3.13.1.yamlkubectl apply -f calico-3.13.1.yaml

賦予init_master.sh腳本文件可執行權限并執行腳本。

# 賦予init_master.sh文件可執行權限chmod a+x ./init_master.sh# 運行init_master.sh腳本./init_master.sh3.查看Master節點的初始化結果

(1)確保所有容器組處于Running狀態

# 執行如下命令,等待 3-10 分鐘,直到所有的容器組處于 Running 狀態watch kubectl get pod -n kube-system -o wide

具體執行如下所示。

[root@test10 ~]# watch kubectl get pod -n kube-system -o wideEvery 2.0s: kubectl get pod -n kube-system -o wide test10: Sun May 10 11:01:32 2020NAME READY STATUS RESTARTS AGE IPNODENOMINATED NODE READINESS GATES calico-kube-controllers-5b8b769fcd-5dtlp 1/1 Running 0 118s 172.18.203.66 test10 <none> <none> calico-node-fnv8g 1/1 Running 0 118s 192.168.0.10 test10 <none> <none> coredns-546565776c-27t7h 1/1 Running 0 2m1s 172.18.203.67 test10 <none> <none> coredns-546565776c-hjb8z 1/1 Running 0 2m1s 172.18.203.65 test10 <none> <none> etcd-test10 1/1 Running 0 2m7s 192.168.0.10 test10 <none> <none> kube-apiserver-test10 1/1 Running 0 2m7s 192.168.0.10 test10 <none> <none> kube-controller-manager-test10 1/1 Running 0 2m7s 192.168.0.10 test10 <none> <none> kube-proxy-dvgsr 1/1 Running 0 2m1s 192.168.0.10 test10 <none> <none> kube-scheduler-test10 1/1 Running 0 2m7s 192.168.0.10 test10 <none>

(2) 查看 Master 節點初始化結果

# 查看Master節點的初始化結果kubectl get nodes -o wide

具體執行如下所示。

[root@test10 ~]# kubectl get nodes -o wideNAMESTATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGEKERNEL-VERSION CONTAINER-RUNTIMEtest10 Ready master 3m28s v1.18.2 192.168.0.10 <none>CentOS Linux 8 (Core) 4.18.0-80.el8.x86_64 docker://19.3.8初始化Worker節點1.獲取join命令參數

在Master節點(test10服務器)上執行如下命令獲取join命令參數。

kubeadm token create --print-join-command

具體執行如下所示。

[root@test10 ~]# kubeadm token create --print-join-commandW0510 11:04:34.828126 56132 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

其中,有如下一行輸出。

kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

這行代碼就是獲取到的join命令。

注意:join命令中的token的有效時間為 2 個小時,2小時內,可以使用此 token 初始化任意數量的 worker 節點。

2.初始化Worker節點

針對所有的 worker 節點執行,在這里,就是在test11服務器和test12服務器上執行。

在命令分別手動執行如下命令。

# 只在 worker 節點執行# 192.168.0.10 為 master 節點的內網 IPexport MASTER_IP=192.168.0.10# 替換 k8s.master 為初始化 master 節點時所使用的 APISERVER_NAMEexport APISERVER_NAME=k8s.masterecho '${MASTER_IP} ${APISERVER_NAME}' >> /etc/hosts# 替換為 master 節點上 kubeadm token create 命令輸出的joinkubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d

具體執行如下所示。

[root@test11 ~]# export MASTER_IP=192.168.0.10[root@test11 ~]# export APISERVER_NAME=k8s.master[root@test11 ~]# echo '${MASTER_IP} ${APISERVER_NAME}' >> /etc/hosts[root@test11 ~]# kubeadm join k8s.master:6443 --token 8nblts.62xytoqufwsqzko2 --discovery-token-ca-cert-hash sha256:1717cc3e34f6a56b642b5751796530e367aa73f4113d09994ac3455e33047c0d W0510 11:08:27.709263 42795 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.[preflight] Running pre-flight checks[WARNING FileExisting-tc]: tc not found in system path[preflight] Reading configuration from the cluster...[preflight] FYI: You can look at this config file with ’kubectl -n kube-system get cm kubeadm-config -oyaml’[kubelet-start] Downloading configuration for the kubelet from the 'kubelet-config-1.18' ConfigMap in the kube-system namespace[kubelet-start] Writing kubelet configuration to file '/var/lib/kubelet/config.yaml'[kubelet-start] Writing kubelet environment file with flags to file '/var/lib/kubelet/kubeadm-flags.env'[kubelet-start] Starting the kubelet[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...This node has joined the cluster:* Certificate signing request was sent to apiserver and a response was received.* The Kubelet was informed of the new secure connection details.Run ’kubectl get nodes’ on the control-plane to see this node join the cluster.

根據輸出結果可以看出,Worker節點加入了K8S集群。

注意:kubeadm join…就是master 節點上 kubeadm token create 命令輸出的join。

3.查看初始化結果

在Master節點(test10服務器)執行如下命令查看初始化結果。

kubectl get nodes -o wide

具體執行如下所示。

[root@test10 ~]# kubectl get nodesNAMESTATUS ROLES AGE VERSIONtest10 Ready master 20m v1.18.2test11 Ready <none> 2m46s v1.18.2test12 Ready <none> 2m46s v1.18.2

注意:kubectl get nodes命令后面加上-o wide參數可以輸出更多的信息。

重啟K8S集群引起的問題1.Worker節點故障不能啟動

Master 節點的 IP 地址發生變化,導致 worker 節點不能啟動。需要重新安裝K8S集群,并確保所有節點都有固定的內網 IP 地址。

2.Pod崩潰或不能正常訪問

重啟服務器后使用如下命令查看Pod的運行狀態。

#查看所有pod的運行情況kubectl get pods --all-namespaces

發現很多 Pod 不在 Running 狀態,此時,需要使用如下命令刪除運行不正常的Pod。

kubectl delete pod <pod-name> -n <pod-namespece>

注意:如果Pod 是使用 Deployment、StatefulSet 等控制器創建的,K8S 將創建新的 Pod 作為替代,重新啟動的 Pod 通常能夠正常工作。

其中,pod-name表示運行在K8S中的pod的名稱,pod-namespece表示命名空間。例如,需要刪除pod名稱為pod-test,命名空間為pod-test-namespace的pod,可以使用下面的命令。

kubectl delete pod pod-test -n pod-test-namespaceK8S安裝ingress-nginx

作為反向代理將外部流量導入集群內部,將 Kubernetes 內部的 Service 暴露給外部,在 Ingress 對象中通過域名匹配 Service,這樣就可以直接通過域名訪問到集群內部的服務了。相對于 traefik 來說,nginx-ingress 性能更加優秀。

注意:在Master節點(test10服務器上執行)

1.創建ingress-nginx命名空間

創建ingress-nginx-namespace.yaml文件,主要的作用是創建ingress-nginx命名空間,文件內容如下所示。

apiVersion: v1kind: Namespacemetadata: name: ingress-nginx labels: name: ingress-nginx

執行如下命令創建ingress-nginx命名空間。

kubectl apply -f ingress-nginx-namespace.yaml2.安裝ingress controller

創建ingress-nginx-mandatory.yaml文件,主要的作用是安裝ingress-nginx。文件內容如下所示。

apiVersion: v1kind: Namespacemetadata: name: ingress-nginx---apiVersion: apps/v1kind: Deploymentmetadata: name: default-http-backend labels: app.kubernetes.io/name: default-http-backend app.kubernetes.io/part-of: ingress-nginx namespace: ingress-nginxspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: default-http-backend app.kubernetes.io/part-of: ingress-nginx template: metadata: labels:app.kubernetes.io/name: default-http-backendapp.kubernetes.io/part-of: ingress-nginx spec: terminationGracePeriodSeconds: 60 containers:- name: default-http-backend # Any image is permissible as long as: # 1. It serves a 404 page at / # 2. It serves 200 on a /healthz endpoint image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 20Mi---apiVersion: v1kind: Servicemetadata: name: default-http-backend namespace: ingress-nginx labels: app.kubernetes.io/name: default-http-backend app.kubernetes.io/part-of: ingress-nginxspec: ports: - port: 80 targetPort: 8080 selector: app.kubernetes.io/name: default-http-backend app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata: name: nginx-configuration namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata: name: tcp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---kind: ConfigMapapiVersion: v1metadata: name: udp-services namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---apiVersion: v1kind: ServiceAccountmetadata: name: nginx-ingress-serviceaccount namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: nginx-ingress-clusterrole labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxrules: - apiGroups: - '' resources: - configmaps - endpoints - nodes - pods - secrets verbs: - list - watch - apiGroups: - '' resources: - nodes verbs: - get - apiGroups: - '' resources: - services verbs: - get - list - watch - apiGroups: - 'extensions' resources: - ingresses verbs: - get - list - watch - apiGroups: - '' resources: - events verbs: - create - patch - apiGroups: - 'extensions' resources: - ingresses/status verbs: - update---apiVersion: rbac.authorization.k8s.io/v1beta1kind: Rolemetadata: name: nginx-ingress-role namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxrules: - apiGroups: - '' resources: - configmaps - pods - secrets - namespaces verbs: - get - apiGroups: - '' resources: - configmaps resourceNames: # Defaults to '<election-id>-<ingress-class>' # Here: '<ingress-controller-leader>-<nginx>' # This has to be adapted if you change either parameter # when launching the nginx-ingress-controller. - 'ingress-controller-leader-nginx' verbs: - get - update - apiGroups: - '' resources: - configmaps verbs: - create - apiGroups: - '' resources: - endpoints verbs: - get---apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata: name: nginx-ingress-role-nisa-binding namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: nginx-ingress-rolesubjects: - kind: ServiceAccount name: nginx-ingress-serviceaccount namespace: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: nginx-ingress-clusterrole-nisa-binding labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: nginx-ingress-clusterrolesubjects: - kind: ServiceAccount name: nginx-ingress-serviceaccount namespace: ingress-nginx---apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-ingress-controller namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxspec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx template: metadata: labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx annotations:prometheus.io/port: '10254'prometheus.io/scrape: 'true' spec: serviceAccountName: nginx-ingress-serviceaccount containers:- name: nginx-ingress-controller image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend - --configmap=$(POD_NAMESPACE)/nginx-configuration - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services - --udp-services-configmap=$(POD_NAMESPACE)/udp-services - --publish-service=$(POD_NAMESPACE)/ingress-nginx - --annotations-prefix=nginx.ingress.kubernetes.io securityContext: capabilities: drop:- ALL add:- NET_BIND_SERVICE # www-data -> 33 runAsUser: 33 env: - name: POD_NAME valueFrom:fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom:fieldRef: fieldPath: metadata.namespace ports: - name: http containerPort: 80 - name: https containerPort: 443 livenessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP initialDelaySeconds: 10 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 readinessProbe: failureThreshold: 3 httpGet: path: /healthz port: 10254 scheme: HTTP periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1---

執行如下命令安裝ingress controller。

kubectl apply -f ingress-nginx-mandatory.yaml3.安裝K8S SVC:ingress-nginx

主要是用來用于暴露pod:nginx-ingress-controller。

創建service-nodeport.yaml文件,文件內容如下所示。

apiVersion: v1kind: Servicemetadata: name: ingress-nginx namespace: ingress-nginx labels: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginxspec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 30080 - name: https port: 443 targetPort: 443 protocol: TCP nodePort: 30443 selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx

執行如下命令安裝。

kubectl apply -f service-nodeport.yaml4.訪問K8S SVC:ingress-nginx

查看ingress-nginx命名空間的部署情況,如下所示。

[root@test10 k8s]# kubectl get pod -n ingress-nginxNAMEREADY STATUS RESTARTS AGEdefault-http-backend-796ddcd9b-vfmgn1/1 Running 1 10hnginx-ingress-controller-58985cc996-87754 1/1 Running 2 10h

在命令行服務器命令行輸入如下命令查看ingress-nginx的端口映射情況。

kubectl get svc -n ingress-nginx

具體如下所示。

[root@test10 k8s]# kubectl get svc -n ingress-nginx NAME TYPECLUSTER-IP EXTERNAL-IP PORT(S) AGEdefault-http-backend ClusterIP 10.96.247.2 <none>80/TCP 7m3singress-nginx NodePort 10.96.40.6 <none>80:30080/TCP,443:30443/TCP 4m35s

所以,可以通過Master節點(test10服務器)的IP地址和30080端口號來訪問ingress-nginx,如下所示。

[root@test10 k8s]# curl 192.168.0.10:30080 default backend - 404

也可以在瀏覽器打開http://192.168.0.10:30080 來訪問ingress-nginx,如下所示。

K8S安裝gitlab代碼倉庫

GitLab是由GitLabInc.開發,使用MIT許可證的基于網絡的Git倉庫管理工具,且具有Wiki和issue跟蹤功能。使用Git作為代碼管理工具,并在此基礎上搭建起來的web服務。

注意:在Master節點(test10服務器上執行)

1.創建k8s-ops命名空間

創建k8s-ops-namespace.yaml文件,主要作用是創建k8s-ops命名空間。文件內容如下所示。

apiVersion: v1kind: Namespacemetadata: name: k8s-ops labels: name: k8s-ops

執行如下命令創建命名空間。

kubectl apply -f k8s-ops-namespace.yaml 2.安裝gitlab-redis

創建gitlab-redis.yaml文件,文件的內容如下所示。

apiVersion: apps/v1kind: Deploymentmetadata: name: redis namespace: k8s-ops labels: name: redisspec: selector: matchLabels: name: redis template: metadata: name: redis labels:name: redis spec: containers: - name: redisimage: sameersbn/redisimagePullPolicy: IfNotPresentports:- name: redis containerPort: 6379volumeMounts:- mountPath: /var/lib/redis name: datalivenessProbe: exec: command: - redis-cli - ping initialDelaySeconds: 30 timeoutSeconds: 5readinessProbe: exec: command: - redis-cli - ping initialDelaySeconds: 10 timeoutSeconds: 5 volumes: - name: datahostPath: path: /data1/docker/xinsrv/redis---apiVersion: v1kind: Servicemetadata: name: redis namespace: k8s-ops labels: name: redisspec: ports: - name: redis port: 6379 targetPort: redis selector: name: redis

首先,在命令行執行如下命令創建/data1/docker/xinsrv/redis目錄。

mkdir -p /data1/docker/xinsrv/redis

執行如下命令安裝gitlab-redis。

kubectl apply -f gitlab-redis.yaml 3.安裝gitlab-postgresql

創建gitlab-postgresql.yaml,文件內容如下所示。

apiVersion: apps/v1kind: Deploymentmetadata: name: postgresql namespace: k8s-ops labels: name: postgresqlspec: selector: matchLabels: name: postgresql template: metadata: name: postgresql labels:name: postgresql spec: containers: - name: postgresqlimage: sameersbn/postgresqlimagePullPolicy: IfNotPresentenv:- name: DB_USER value: gitlab- name: DB_PASS value: passw0rd- name: DB_NAME value: gitlab_production- name: DB_EXTENSION value: pg_trgmports:- name: postgres containerPort: 5432volumeMounts:- mountPath: /var/lib/postgresql name: datalivenessProbe: exec: command: - pg_isready - -h - localhost - -U - postgres initialDelaySeconds: 30 timeoutSeconds: 5readinessProbe: exec: command: - pg_isready - -h - localhost - -U - postgres initialDelaySeconds: 5 timeoutSeconds: 1 volumes: - name: datahostPath: path: /data1/docker/xinsrv/postgresql---apiVersion: v1kind: Servicemetadata: name: postgresql namespace: k8s-ops labels: name: postgresqlspec: ports: - name: postgres port: 5432 targetPort: postgres selector: name: postgresql

首先,執行如下命令創建/data1/docker/xinsrv/postgresql目錄。

mkdir -p /data1/docker/xinsrv/postgresql

接下來,安裝gitlab-postgresql,如下所示。

kubectl apply -f gitlab-postgresql.yaml4.安裝gitlab

(1)配置用戶名和密碼

首先,在命令行使用base64編碼為用戶名和密碼進行轉碼,本示例中,使用的用戶名為admin,密碼為admin.1231

轉碼情況如下所示。

[root@test10 k8s]# echo -n ’admin’ | base64 YWRtaW4=[root@test10 k8s]# echo -n ’admin.1231’ | base64 YWRtaW4uMTIzMQ==

轉碼后的用戶名為:YWRtaW4= 密碼為:YWRtaW4uMTIzMQ==

也可以對base64編碼后的字符串解碼,例如,對密碼字符串解碼,如下所示。

[root@test10 k8s]# echo ’YWRtaW4uMTIzMQ==’ | base64 --decode admin.1231

接下來,創建secret-gitlab.yaml文件,主要是用戶來配置GitLab的用戶名和密碼,文件內容如下所示。

apiVersion: v1kind: Secretmetadata: namespace: k8s-ops name: git-user-passtype: Opaquedata: username: YWRtaW4= password: YWRtaW4uMTIzMQ==

執行配置文件的內容,如下所示。

kubectl create -f ./secret-gitlab.yaml

(2)安裝GitLab

創建gitlab.yaml文件,文件的內容如下所示。

apiVersion: apps/v1kind: Deploymentmetadata: name: gitlab namespace: k8s-ops labels: name: gitlabspec: selector: matchLabels: name: gitlab template: metadata: name: gitlab labels:name: gitlab spec: containers: - name: gitlabimage: sameersbn/gitlab:12.1.6imagePullPolicy: IfNotPresentenv:- name: TZ value: Asia/Shanghai- name: GITLAB_TIMEZONE value: Beijing- name: GITLAB_SECRETS_DB_KEY_BASE value: long-and-random-alpha-numeric-string- name: GITLAB_SECRETS_SECRET_KEY_BASE value: long-and-random-alpha-numeric-string- name: GITLAB_SECRETS_OTP_KEY_BASE value: long-and-random-alpha-numeric-string- name: GITLAB_ROOT_PASSWORD valueFrom: secretKeyRef: name: git-user-pass key: password- name: GITLAB_ROOT_EMAIL value: 12345678@qq.com- name: GITLAB_HOST value: gitlab.binghe.com- name: GITLAB_PORT value: '80'- name: GITLAB_SSH_PORT value: '30022'- name: GITLAB_NOTIFY_ON_BROKEN_BUILDS value: 'true'- name: GITLAB_NOTIFY_PUSHER value: 'false'- name: GITLAB_BACKUP_SCHEDULE value: daily- name: GITLAB_BACKUP_TIME value: 01:00- name: DB_TYPE value: postgres- name: DB_HOST value: postgresql- name: DB_PORT value: '5432'- name: DB_USER value: gitlab- name: DB_PASS value: passw0rd- name: DB_NAME value: gitlab_production- name: REDIS_HOST value: redis- name: REDIS_PORT value: '6379'ports:- name: http containerPort: 80- name: ssh containerPort: 22volumeMounts:- mountPath: /home/git/data name: datalivenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 180 timeoutSeconds: 5readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 timeoutSeconds: 1 volumes: - name: datahostPath: path: /data1/docker/xinsrv/gitlab---apiVersion: v1kind: Servicemetadata: name: gitlab namespace: k8s-ops labels: name: gitlabspec: ports: - name: http port: 80 nodePort: 30088 - name: ssh port: 22 targetPort: ssh nodePort: 30022 type: NodePort selector: name: gitlab---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: gitlab namespace: k8s-ops annotations: kubernetes.io/ingress.class: traefikspec: rules: - host: gitlab.binghe.com http: paths: - backend: serviceName: gitlab servicePort: http

注意:在配置GitLab時,監聽主機時,不能使用IP地址,需要使用主機名或者域名,上述配置中,我使用的是gitlab.binghe.com主機名。

在命令行執行如下命令創建/data1/docker/xinsrv/gitlab目錄。

mkdir -p /data1/docker/xinsrv/gitlab

安裝GitLab,如下所示。

kubectl apply -f gitlab.yaml5.安裝完成

查看k8s-ops命名空間部署情況,如下所示。

[root@test10 k8s]# kubectl get pod -n k8s-opsNAME READY STATUS RESTARTS AGEgitlab-7b459db47c-5vk6t 0/1 Running 0 11spostgresql-79567459d7-x52vx 1/1 Running 0 30mredis-67f4cdc96c-h5ckz1/1 Running 1 10h

也可以使用如下命令查看。

[root@test10 k8s]# kubectl get pod --namespace=k8s-opsNAME READY STATUS RESTARTS AGEgitlab-7b459db47c-5vk6t 0/1 Running 0 36spostgresql-79567459d7-x52vx 1/1 Running 0 30mredis-67f4cdc96c-h5ckz1/1 Running 1 10h

二者效果一樣。

接下來,查看GitLab的端口映射,如下所示。

[root@test10 k8s]# kubectl get svc -n k8s-opsNAME TYPECLUSTER-IP EXTERNAL-IP PORT(S) AGEgitlab NodePort 10.96.153.100 <none>80:30088/TCP,22:30022/TCP 2m42spostgresql ClusterIP 10.96.203.119 <none>5432/TCP 32mredisClusterIP 10.96.107.150 <none>6379/TCP 10h

此時,可以看到,可以通過Master節點(test10)的主機名gitlab.binghe.com和端口30088就能夠訪問GitLab。由于我這里使用的是虛擬機來搭建相關的環境,在本機訪問虛擬機映射的gitlab.binghe.com時,需要配置本機的hosts文件,在本機的hosts文件中加入如下配置項。

192.168.0.10 gitlab.binghe.com

注意:在Windows操作系統中,hosts文件所在的目錄如下。

C:WindowsSystem32driversetc

接下來,就可以在瀏覽器中通過鏈接:http://gitlab.binghe.com:30088 來訪問GitLab了,如下所示。

此時,可以通過用戶名root和密碼admin.1231來登錄GitLab了。

注意:這里的用戶名是root而不是admin,因為root是GitLab默認的超級用戶。

到此,K8S安裝gitlab完成。

安裝Harbor私有倉庫

Habor是由VMWare公司開源的容器鏡像倉庫。事實上,Habor是在Docker Registry上進行了相應的企業級擴展,從而獲得了更加廣泛的應用,這些新的企業級特性包括:管理用戶界面,基于角色的訪問控制 ,AD/LDAP集成以及審計日志等,足以滿足基本企業需求。

注意:這里將Harbor私有倉庫安裝在Master節點(test10服務器)上,實際生產環境中建議安裝在其他服務器。

1.下載Harbor的離線安裝版本

wget https://github.com/goharbor/harbor/releases/download/v1.10.2/harbor-offline-installer-v1.10.2.tgz2.解壓Harbor的安裝包

tar -zxvf harbor-offline-installer-v1.10.2.tgz

解壓成功后,會在服務器當前目錄生成一個harbor目錄。

3.配置Harbor

注意:這里,我將Harbor的端口修改成了1180,如果不修改Harbor的端口,默認的端口是80。

(1)修改harbor.yml文件

cd harborvim harbor.yml

修改的配置項如下所示。

hostname: 192.168.0.10http: port: 1180harbor_admin_password: binghe123###并把https注釋掉,不然在安裝的時候會報錯:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set#https: #port: 443 #certificate: /your/certificate/path #private_key: /your/private/key/path

(2)修改daemon.json文件

修改/etc/docker/daemon.json文件,沒有的話就創建,在/etc/docker/daemon.json文件中添加如下內容。

[root@binghe~]# cat /etc/docker/daemon.json{ 'registry-mirrors': ['https://zz3sblpi.mirror.aliyuncs.com'], 'insecure-registries':['192.168.0.10:1180']}

也可以在服務器上使用 ip addr 命令查看本機所有的IP地址段,將其配置到/etc/docker/daemon.json文件中。這里,我配置后的文件內容如下所示。

{ 'registry-mirrors': ['https://zz3sblpi.mirror.aliyuncs.com'], 'insecure-registries':['192.168.175.0/16','172.17.0.0/16', '172.18.0.0/16', '172.16.29.0/16', '192.168.0.10:1180']}4.安裝并啟動harbor

配置完成后,輸入如下命令即可安裝并啟動Harbor

[root@binghe harbor]# ./install.sh 5.登錄Harbor并添加賬戶

安裝成功后,在瀏覽器地址欄輸入http://192.168.0.10:1180打開鏈接,輸入用戶名admin和密碼binghe123,登錄系統。

接下來,我們選擇用戶管理,添加一個管理員賬戶,為后續打包Docker鏡像和上傳Docker鏡像做準備。

密碼為Binghe123。點擊確,此時,賬戶binghe還不是管理員,此時選中binghe賬戶,點擊“設置為管理員”。

此時,binghe賬戶就被設置為管理員了。到此,Harbor的安裝就完成了。

6.修改Harbor端口

如果安裝Harbor后,大家需要修改Harbor的端口,可以按照如下步驟修改Harbor的端口,這里,我以將80端口修改為1180端口為例

(1)修改harbor.yml文件

cd harborvim harbor.yml

修改的配置項如下所示。

hostname: 192.168.0.10http: port: 1180harbor_admin_password: binghe123###并把https注釋掉,不然在安裝的時候會報錯:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set#https: #port: 443 #certificate: /your/certificate/path #private_key: /your/private/key/path

(2)修改docker-compose.yml文件

vim docker-compose.yml

修改的配置項如下所示。

ports: - 1180:80

(3)修改config.yml文件

cd common/config/registryvim config.yml

修改的配置項如下所示。

realm: http://192.168.0.10:1180/service/token

(4)重啟Docker

systemctl daemon-reloadsystemctl restart docker.service

(5)重啟Harbor

[root@binghe harbor]# docker-compose downStopping harbor-log ... doneRemoving nginx ... doneRemoving harbor-portal ... doneRemoving harbor-jobservice ... doneRemoving harbor-core ... doneRemoving redis ... doneRemoving registry ... doneRemoving registryctl ... doneRemoving harbor-db ... doneRemoving harbor-log... doneRemoving network harbor_harbor [root@binghe harbor]# ./prepareprepare base dir is set to /mnt/harborClearing the configuration file: /config/log/logrotate.confClearing the configuration file: /config/nginx/nginx.confClearing the configuration file: /config/core/envClearing the configuration file: /config/core/app.confClearing the configuration file: /config/registry/root.crtClearing the configuration file: /config/registry/config.ymlClearing the configuration file: /config/registryctl/envClearing the configuration file: /config/registryctl/config.ymlClearing the configuration file: /config/db/envClearing the configuration file: /config/jobservice/envClearing the configuration file: /config/jobservice/config.ymlGenerated configuration file: /config/log/logrotate.confGenerated configuration file: /config/nginx/nginx.confGenerated configuration file: /config/core/envGenerated configuration file: /config/core/app.confGenerated configuration file: /config/registry/config.ymlGenerated configuration file: /config/registryctl/envGenerated configuration file: /config/db/envGenerated configuration file: /config/jobservice/envGenerated configuration file: /config/jobservice/config.ymlloaded secret from file: /secret/keys/secretkeyGenerated configuration file: /compose_location/docker-compose.ymlClean up the input dir [root@binghe harbor]# docker-compose up -dCreating network 'harbor_harbor' with the default driverCreating harbor-log ... doneCreating harbor-db ... doneCreating redis ... doneCreating registry ... doneCreating registryctl ... doneCreating harbor-core ... doneCreating harbor-jobservice ... doneCreating harbor-portal ... doneCreating nginx ... done [root@binghe harbor]# docker ps -aCONTAINER IDIMAGE COMMAND CREATED STATUS PORTS安裝Jenkins(一般的做法)

Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持續、自動的構建/測試軟件項目、監控外部任務的運行(這個比較抽象,暫且寫上,不做解釋)。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中運行,也可獨立運行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。

1.安裝nfs(之前安裝過的話,可以省略此步)

使用 nfs 最大的問題就是寫權限,可以使用 kubernetes 的 securityContext/runAsUser 指定 jenkins 容器中運行 jenkins 的用戶 uid,以此來指定 nfs 目錄的權限,讓 jenkins 容器可寫;也可以不限制,讓所有用戶都可以寫。這里為了簡單,就讓所有用戶可寫了。

如果之前已經安裝過nfs,則這一步可以省略。找一臺主機,安裝 nfs,這里,我以在Master節點(test10服務器)上安裝nfs為例。

在命令行輸入如下命令安裝并啟動nfs。

yum install nfs-utils -ysystemctl start nfs-serversystemctl enable nfs-server2.創建nfs共享目錄

在Master節點(test10服務器)上創建 /opt/nfs/jenkins-data目錄作為nfs的共享目錄,如下所示。

mkdir -p /opt/nfs/jenkins-data

接下來,編輯/etc/exports文件,如下所示。

vim /etc/exports

在/etc/exports文件文件中添加如下一行配置。

/opt/nfs/jenkins-data 192.168.175.0/24(rw,all_squash)

這里的 ip 使用 kubernetes node 節點的 ip 范圍,后面的 all_squash 選項會將所有訪問的用戶都映射成 nfsnobody 用戶,不管你是什么用戶訪問,最終都會壓縮成 nfsnobody,所以只要將 /opt/nfs/jenkins-data 的屬主改為 nfsnobody,那么無論什么用戶來訪問都具有寫權限。

這個選項在很多機器上由于用戶 uid 不規范導致啟動進程的用戶不同,但是同時要對一個共享目錄具有寫權限時很有效。

接下來,為 /opt/nfs/jenkins-data目錄授權,并重新加載nfs,如下所示。

#為/opt/nfs/jenkins-data/目錄授權chown -R 1000 /opt/nfs/jenkins-data/#重新加載nfs-serversystemctl reload nfs-server

在K8S集群中任意一個節點上使用如下命令進行驗證:

#查看nfs系統的目錄權限showmount -e NFS_IP

如果能夠看到 /opt/nfs/jenkins-data 就表示 ok 了。

具體如下所示。

[root@test10 ~]# showmount -e 192.168.0.10Export list for 192.168.0.10:/opt/nfs/jenkins-data 192.168.175.0/24[root@test11 ~]# showmount -e 192.168.0.10Export list for 192.168.0.10:/opt/nfs/jenkins-data 192.168.175.0/243.創建PV

Jenkins 其實只要加載對應的目錄就可以讀取之前的數據,但是由于 deployment 無法定義存儲卷,因此我們只能使用 StatefulSet。

首先創建 pv,pv 是給 StatefulSet 使用的,每次 StatefulSet 啟動都會通過 volumeClaimTemplates 這個模板去創建 pvc,因此必須得有 pv,才能供 pvc 綁定。

創建jenkins-pv.yaml文件,文件內容如下所示。

apiVersion: v1kind: PersistentVolumemetadata: name: jenkinsspec: nfs: path: /opt/nfs/jenkins-data server: 192.168.0.10 accessModes: ['ReadWriteOnce'] capacity: storage: 1Ti

我這里給了 1T存儲空間,可以根據實際配置。

執行如下命令創建pv。

kubectl apply -f jenkins-pv.yaml 4.創建serviceAccount

創建service account,因為 jenkins 后面需要能夠動態創建 slave,因此它必須具備一些權限。

創建jenkins-service-account.yaml文件,文件內容如下所示。

apiVersion: v1kind: ServiceAccountmetadata: name: jenkins---kind: RoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: jenkinsrules: - apiGroups: [''] resources: ['pods'] verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] - apiGroups: [''] resources: ['pods/exec'] verbs: ['create', 'delete', 'get', 'list', 'patch', 'update', 'watch'] - apiGroups: [''] resources: ['pods/log'] verbs: ['get', 'list', 'watch'] - apiGroups: [''] resources: ['secrets'] verbs: ['get']---apiVersion: rbac.authorization.k8s.io/v1beta1kind: RoleBindingmetadata: name: jenkinsroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: jenkinssubjects: - kind: ServiceAccount name: jenkins

上述配置中,創建了一個 RoleBinding 和一個 ServiceAccount,并且將 RoleBinding 的權限綁定到這個用戶上。所以,jenkins 容器必須使用這個 ServiceAccount 運行才行,不然 RoleBinding 的權限它將不具備。

RoleBinding 的權限很容易就看懂了,因為 jenkins 需要創建和刪除 slave,所以才需要上面這些權限。至于 secrets 權限,則是 https 證書。

執行如下命令創建serviceAccount。

kubectl apply -f jenkins-service-account.yaml 5.安裝Jenkins

創建jenkins-statefulset.yaml文件,文件內容如下所示。

apiVersion: apps/v1kind: StatefulSetmetadata: name: jenkins labels: name: jenkinsspec: selector: matchLabels: name: jenkins serviceName: jenkins replicas: 1 updateStrategy: type: RollingUpdate template: metadata: name: jenkins labels:name: jenkins spec: terminationGracePeriodSeconds: 10 serviceAccountName: jenkins containers:- name: jenkins image: docker.io/jenkins/jenkins:lts imagePullPolicy: IfNotPresent ports: - containerPort: 8080 - containerPort: 32100 resources: limits: cpu: 4 memory: 4Gi requests: cpu: 4 memory: 4Gi env: - name: LIMITS_MEMORY valueFrom:resourceFieldRef: resource: limits.memory divisor: 1Mi - name: JAVA_OPTS # value: -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 value: -Xmx$(LIMITS_MEMORY)m -XshowSettings:vm -Dhudson.slaves.NodeProvisioner.initialDelay=0 -Dhudson.slaves.NodeProvisioner.MARGIN=50 -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85 volumeMounts: - name: jenkins-home mountPath: /var/jenkins_home livenessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 # ~2 minutes readinessProbe: httpGet: path: /login port: 8080 initialDelaySeconds: 60 timeoutSeconds: 5 failureThreshold: 12 # ~2 minutes # pvc 模板,對應之前的 pv volumeClaimTemplates: - metadata:name: jenkins-home spec:accessModes: ['ReadWriteOnce']resources: requests: storage: 1Ti

jenkins 部署時需要注意它的副本數,你的副本數有多少就要有多少個 pv,同樣,存儲會有多倍消耗。這里我只使用了一個副本,因此前面也只創建了一個 pv。

使用如下命令安裝Jenkins。

kubectl apply -f jenkins-statefulset.yaml 6.創建Service

創建jenkins-service.yaml文件,主要用于后臺運行Jenkins,文件內容如下所示。

apiVersion: v1kind: Servicemetadata: name: jenkinsspec: # type: LoadBalancer selector: name: jenkins # ensure the client ip is propagated to avoid the invalid crumb issue when using LoadBalancer (k8s >=1.7) #externalTrafficPolicy: Local ports: - name: http port: 80 nodePort: 31888 targetPort: 8080 protocol: TCP - name: jenkins-agent port: 32100 nodePort: 32100 targetPort: 32100 protocol: TCP type: NodePort

使用如下命令安裝Service。

kubectl apply -f jenkins-service.yaml 7.安裝 ingress

jenkins 的 web 界面需要從集群外訪問,這里我們選擇的是使用 ingress。創建jenkins-ingress.yaml文件,文件內容如下所示。

apiVersion: extensions/v1beta1kind: Ingressmetadata: name: jenkinsspec: rules: - http:paths: - path: / backend: serviceName: jenkins servicePort: 31888 host: jekins.binghe.com

這里,需要注意的是host必須配置為域名或者主機名,否則會報錯,如下所示。

The Ingress 'jenkins' is invalid: spec.rules[0].host: Invalid value: '192.168.0.10': must be a DNS name, not an IP address

使用如下命令安裝ingress。

kubectl apply -f jenkins-ingress.yaml

最后,由于我這里使用的是虛擬機來搭建相關的環境,在本機訪問虛擬機映射的jekins.binghe.com時,需要配置本機的hosts文件,在本機的hosts文件中加入如下配置項。

192.168.0.10 jekins.binghe.com

注意:在Windows操作系統中,hosts文件所在的目錄如下。

C:WindowsSystem32driversetc

接下來,就可以在瀏覽器中通過鏈接:http://jekins.binghe.com:31888 來訪問Jekins了。

物理機安裝SVN

Apache Subversion 通常被縮寫成 SVN,是一個開放源代碼的版本控制系統,Subversion 在 2000 年由 CollabNet Inc 開發,現在發展成為 Apache 軟件基金會的一個項目,同樣是一個豐富的開發者和用戶社區的一部分。

SVN相對于的RCS、CVS,采用了分支管理系統,它的設計目標就是取代CVS?;ヂ摼W上免費的版本控制服務多基于Subversion。

這里,以在Master節點(binghe101服務器)上安裝SVN為例。

1.使用yum安裝SVN

在命令行執行如下命令安裝SVN。

yum -y install subversion 2.創建SVN庫

依次執行如下命令。

#創建/data/svnmkdir -p /data/svn #初始化svnsvnserve -d -r /data/svn#創建代碼倉庫svnadmin create /data/svn/test3.配置SVN

mkdir /data/svn/confcp /data/svn/test/conf/* /data/svn/conf/cd /data/svn/conf/[root@binghe101 conf]# ll總用量 20-rw-r--r-- 1 root root 1080 5月 12 02:17 authz-rw-r--r-- 1 root root 885 5月 12 02:17 hooks-env.tmpl-rw-r--r-- 1 root root 309 5月 12 02:17 passwd-rw-r--r-- 1 root root 4375 5月 12 02:17 svnserve.conf

配置authz文件,

vim authz

配置后的內容如下所示。

[aliases]# joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average[groups]# harry_and_sally = harry,sally# harry_sally_and_joe = harry,sally,&joeSuperAdmin = adminbinghe = admin,binghe# [/foo/bar]# harry = rw# &joe = r# * =# [repository:/baz/fuz]# @harry_and_sally = rw# * = r[test:/]@SuperAdmin=rw@binghe=rw

配置passwd文件

vim passwd

配置后的內容如下所示。

[users]# harry = harryssecret# sally = sallyssecretadmin = admin123binghe = binghe123

配置 svnserve.conf

vim svnserve.conf

配置后的文件如下所示。

### This file controls the configuration of the svnserve daemon, if you### use it to allow access to this repository. (If you only allow### access through http: and/or file: URLs, then this file is### irrelevant.)### Visit http://subversion.apache.org/ for more information.[general]### The anon-access and auth-access options control access to the### repository for unauthenticated (a.k.a. anonymous) users and### authenticated users, respectively.### Valid values are 'write', 'read', and 'none'.### Setting the value to 'none' prohibits both reading and writing;### 'read' allows read-only access, and 'write' allows complete ### read/write access to the repository.### The sample settings below are the defaults and specify that anonymous### users have read-only access to the repository, while authenticated### users have read and write access to the repository.anon-access = noneauth-access = write### The password-db option controls the location of the password### database file. Unless you specify a path starting with a /,### the file’s location is relative to the directory containing### this configuration file.### If SASL is enabled (see below), this file will NOT be used.### Uncomment the line below to use the default password file.password-db = /data/svn/conf/passwd### The authz-db option controls the location of the authorization### rules for path-based access control. Unless you specify a path### starting with a /, the file’s location is relative to the### directory containing this file. The specified path may be a### repository relative URL (^/) or an absolute file:// URL to a text### file in a Subversion repository. If you don’t specify an authz-db,### no path-based access control is done.### Uncomment the line below to use the default authorization file.authz-db = /data/svn/conf/authz### The groups-db option controls the location of the file with the### group definitions and allows maintaining groups separately from the### authorization rules. The groups-db file is of the same format as the### authz-db file and should contain a single [groups] section with the### group definitions. If the option is enabled, the authz-db file cannot### contain a [groups] section. Unless you specify a path starting with### a /, the file’s location is relative to the directory containing this### file. The specified path may be a repository relative URL (^/) or an### absolute file:// URL to a text file in a Subversion repository.### This option is not being used by default.# groups-db = groups### This option specifies the authentication realm of the repository.### If two repositories have the same authentication realm, they should### have the same password database, and vice versa. The default realm### is repository’s uuid.realm = svn### The force-username-case option causes svnserve to case-normalize### usernames before comparing them against the authorization rules in the### authz-db file configured above. Valid values are 'upper' (to upper-### case the usernames), 'lower' (to lowercase the usernames), and### 'none' (to compare usernames as-is without case conversion, which### is the default behavior).# force-username-case = none### The hooks-env options specifies a path to the hook script environment ### configuration file. This option overrides the per-repository default### and can be used to configure the hook script environment for multiple ### repositories in a single file, if an absolute path is specified.### Unless you specify an absolute path, the file’s location is relative### to the directory containing this file.# hooks-env = hooks-env[sasl]### This option specifies whether you want to use the Cyrus SASL### library for authentication. Default is false.### Enabling this option requires svnserve to have been built with Cyrus### SASL support; to check, run ’svnserve --version’ and look for a line### reading ’Cyrus SASL authentication is available.’# use-sasl = true### These options specify the desired strength of the security layer### that you want SASL to provide. 0 means no encryption, 1 means### integrity-checking only, values larger than 1 are correlated### to the effective key length for encryption (e.g. 128 means 128-bit### encryption). The values below are the defaults.# min-encryption = 0# max-encryption = 256

接下來,將/data/svn/conf目錄下的svnserve.conf文件復制到/data/svn/test/conf/目錄下。如下所示。

[root@binghe101 conf]# cp /data/svn/conf/svnserve.conf /data/svn/test/conf/cp:是否覆蓋’/data/svn/test/conf/svnserve.conf’? y4.啟動SVN服務

(1)創建svnserve.service服務

創建svnserve.service文件

vim /usr/lib/systemd/system/svnserve.service

文件的內

標簽: Docker
相關文章:
主站蜘蛛池模板: 国产日产精品一区二区三区四区介绍 | 亚洲精品男人天堂 | 北条麻妃久久精品 | 古风h啪肉禁欲 | 天天操夜夜拍 | 国产精品亚洲欧美大片在线看 | 欧美老妇大p毛茸茸 | 国产伦子伦视频在线观看 | 色呦呦网站在线观看 | 另类激情亚洲 | 国产精品一区二区三区在线 | 性欧美牲交xxxxx视频 | 美女黄色av| 好男人社区www在线官网 | 91毛片视频| 免费观看又色又爽又黄的崩锅 | 污网站免费在线观看 | www.超碰在线| 亚洲不卡免费视频 | 日本一级特黄aa大片 | 欧美xxxx黑人又粗又长 | 污污网站在线免费观看 | 香蕉国产片一级一级一级一级 | 人妻 校园 激情 另类 | 亚洲黄色一级 | 久久久久久夜精品精品免费啦 | 不卡av片| 在线成年人视频 | 97一区二区三区 | 天天色综合6 | 久久99精品久久久久久久青青日本 | 亚洲黄色网址大全 | 偷拍激情视频一区二区三区 | 欧美日韩在线播放三区四区 | 公妇乱淫免费观看 | 婷婷综合另类小说色区 | 中字幕人妻一区二区三区 | 久久人人添人人爽添人人88v | 18无码粉嫩小泬无套在线观看 | 国产精品久久影院 | 狠狠色噜噜狠狠狠狠777米奇 | 一个人在线观看www软件 | 国产 日韩 欧美 制服丝袜 | 最近免费中文字幕mv在线视频3 | 亚洲啪| 高h禁伦肉伦np双龙 高h捆绑拘束调教小说 | 黑人与日本少妇高潮 | 成人黄色免费看 | 日本不卡网站 | 劲爆欧美第一页 | 91精品国产综合久久久蜜臀粉嫩 | 九九热国产在线 | 91在线精品啪婷婷 | 青青久久国产 | 欧美色一区二区三区在线观看 | 色婷婷欧美在线播放内射 | 国产精品久久久久久久成人午夜 | 内射中出无码护士在线 | 九草在线| 天天操夜夜躁 | www.51色.com| 邻居少妇张开双腿让我爽一夜图片 | 怡红院av久久久久久久 | 国产成人一区二区三区视频 | 在线免费观看不卡av | 自拍偷拍中文字幕 | 公妇借种乱h中文字幕 | 福利一区福利二区 | 久久久久久久久久一级 | 97在线视频网站 | 丰满白嫩欧洲美女图片 | 中文字幕一区二区在线视频 | 综合久久精品 | 亚洲精品一区二区三区四区乱码 | 无码国产精品一区二区色情男同 | 精品视频9999| 亚洲福利av| 高h禁伦1v1公妇借种 | 九九热免费在线视频 | 91视频污在线观看 | av片在线看免费高清网站 | 亲子伦视频一区二区三区 | 亚洲精品456在线播放 | 国产做a爱片久久毛片 | 日本午夜理伦影片大全 | 精品乱 | 伊人网av在线 | 日日噜噜夜夜狠狠久久丁香五月 | 亚洲日韩成人av无码网站 | 亡は夫の上司中文字幕 | 亚洲最大成人网4388xx | 亚洲精品色 | 久久精品99国产精品日本 | 亚洲中字幕 | 一曲二曲三曲在线观看中文字幕动漫 | 日韩视频欧美视频 | 国产毛片在线视频 | 刘亦菲乱码一区二区三区 | 四虎永久在线精品免费网站 | 黄色一级视频网站 | 久久伊99综合婷婷久久伊 | 精品国产_亚洲人成在线 | 中文字幕一区二区在线播放 | 国产精品麻豆成人av电影艾秋 | 各种含道具高h调教1v1男男 | 成人依人 | 在线人人车操人人看视频 | 欧美一级黄色片网站 | 爱情岛论坛亚洲品质自拍网址 | 欧美国产精品一区二区三区 | 国产一区二区四区 | 自拍偷拍第 | 狠狠色噜噜| 图书馆的女友动漫在线观看 | 亚洲妇女无套内射精 | 欧洲lv尺码大精品久久久 | 国产自产在线视频 | 激情综合亚洲色婷婷五月app | 中文av一区 | 1000部精品久久久久久久久 | 国产xxx在线 | yyyy11111少妇无码影院 | 亚洲综合另类 | 日产欧美一区二区三区不上 | 不卡免费视频 | 国产午夜亚洲精品羞羞网站 | 男女午夜影院 | 丁香激情综合久久伊人久久 | 精品久久久久久无码人妻 | 99久久久无码国产精品试看 | 18禁黄网站禁片免费观看 | 亚洲天堂一级 | 亚洲高清国产拍精品网络战 | 国产日韩精品中文字无码 | 亚洲视频大全 | 国产后进极品圆润翘臀在后面玩 | 高清一级片| 美女免费黄视频 | 中国少妇的呻吟xvideoshd | 在线日韩成人 | 2020国产精品视频 | 成人精品久久日伦片大全免费 | 国产日韩视频在线观看 | 日韩一级二级视频 | 91麻豆精品国产91久久久点播时间 | 国产无区一区二区三麻豆 | 色婷婷国产精品免费网站 | 色婷婷丁香 | 国内精品人妻无码久久久影院导航 | 国产免费人做人爱午夜视频 | 国产熟睡乱子伦视频 | 国产精品日本一区二区在线播放 | www.成人网.com| 久久久久久久综合 | 疯狂三人交性欧美 | 成人精品久久日伦片大全免费 | 性猛交xxxx乱大交3 | 欧美丰满熟妇hdxx | 亚洲欧美另类图片 | 色女孩综合 | 手机看片日韩久久 | 黄色网址最新 | 18视频在线观看娇喘 | 超碰aⅴ人人做人人爽欧美 狠狠亚洲婷婷综合色香五月 | √天堂资源在线 | 综合网在线视频 | 欧美成人精品欧美一级乱黄 | 免费看黄色a级片 | 少妇啊灬啊别停灬用力啊免费视频 | 国产精品中文字幕av | 91av视频在线播放 | 玖玖在线免费视频 | 最新极品jizzhd欧美 | 日韩欧美在线综合网 | 天堂av手机在线 | 伊人网站在线观看 | av天堂久久天堂色综合 | 欧美亚洲国产成人一区二区三区 | 国偷自产av一区二区三区小尤奈 | av手机免费在线观看 | 久操视频免费观看 | www激情| 久草热在线视频 | 欧美激情专区 | 少妇沉沦哀羞迎合呻吟视频 | 久久精品亚洲a | 亚洲精品在线网站 | 99蜜桃臀久久久欧美精品网站 | 性高潮久久久久久久久 | 超碰97av| 五月天婷婷亚洲 | 国产伦精品一区二区三区在线 | 超碰在线观看99 | 韩国精品久久久 | 国产无在线观看 | 亚洲国产精品久久久久 | 久久综合噜噜激激的五月天 | av大全免费| 亚洲一二三区不卡 | 成人无码影片精品久久久 | 亚洲精品精品 | 成年人免费在线观看网站 | 日韩亚洲欧美中文高清在线 | 无人码一区二区三区视频 | 成人婷婷网色偷偷亚洲男人的天堂 | 又大又长又粗又爽又黄少妇视频 | 日韩亚洲影院 | 巨胸喷奶水视频www 午夜无码国产理论在线 | 亚洲精品欧美综合二区 | 成人av免费在线 | 日本做暖暖xo小视频 | 91久久极品少妇韩国 | 久久精品国产大片免费观看 | 免费一级特黄特色毛片久久看 | 日本a级黄色| 欧美成人家庭影院 | 久操福利 | 三级全黄做爰龚玥菲在线 | 国产精品免费视频一区二区三区 | 一区二区免费在线观看 | 一级黄在线观看 | 国产精品不卡av | 亚洲人视频在线观看 | 成人a级片 | 免费日韩 | 高潮中文字幕 | 美女视频黄的全免费视频网站 | 51久久久 | 成人国产精品入麻豆 | jizzjizzjizz亚洲女| 午夜国产精品视频 | 女人脱了内裤趴开腿让男躁 | 精品人妻少妇一区二区三区 | 免费做a爰片77777 | 久久久免费观看 | 精品国产一二 | 免费毛片网 | 成人涩涩 | 欧美性aaa| 久久午夜夜伦鲁鲁片免费无码 | 97精品一区二区视频在线观看 | 亚洲女人毛片 | 亚洲午夜久久久久久久久久久 | 国产地址一 | 亚洲人成网站精品片在线观看 | 亚洲精品无码永久中文字幕 | 日本又色又爽又黄的a片18禁 | 国产成人啪精品午夜网站 | 麻豆av福利av久久av | 国产一级免费片 | 中日韩在线观看视频 | 国产成网站18禁止久久影院 | 婷婷六月激情 | 麻豆aⅴ精品无码一区二区 午夜福制92视频 | 国产免费一区二区三区在线观看 | 嫩草一区二区 | 催眠调教后宫乱淫校园 | 久久性生活视频 | 婷婷综合少妇啪啪喷水动态小说 | 欧美熟妇xxxxx欧美老妇不卡 | 欧美亚洲在线播放 | 高潮喷水抽搐无码免费 | 激情四射网 | 日韩精品免费一区二区夜夜嗨 | 国产丝袜在线 | 国产精品成人免费一区久久羞羞 | 日本少强伦xxxhd | 中文字幕a∨在线乱码免费看 | 国产精品一级 | 无码人妻丰满熟妇区毛片18 | 中文精品一区二区三区四区 | 亚洲一区二区视频 | 中文字幕在线免费 | 夜夜爱夜夜做夜夜爽 | 国产真实乱免费高清视频 | 国产成人无码a区在线视频无码dvd | 精品国产乱码久久久久久天狼 | 国产情侣av自拍 | 欧美aaaa视频 | 2019中文字幕在线观看 | 久久久久久一区二区三区 | 亚洲人成网站色7799 | 亚洲精品在线观看视频 | 成人影视在线看 | 奇米一区二区三区四区久久 | 美女18网站 | 最新免费中文字幕 | 色亚洲色图 | 国内精品久久久久久久影视 | 午夜三级a三级三点窝 | 337p日本大胆噜噜噜鲁 | 日本色www | 成人国产欧美大片一区 | 973理论片235影院9 | 亚洲精品av羞羞禁网站 | 完美奇遇在线观看 | 爱丝aiss无内高清丝袜视频 | 久久精品高清一区二区三区 | 久久久久人妻精品一区三寸 | 国产一级网站 | 91禁在线看 | 七七久久 | 精品国产露脸精彩对白 | 国产精品日韩精品 | 天天爽 | 欧美一区二区三区激情视频 | 91蜜桃婷婷狠狠久久综合9色 | 国产日韩欧美精品在线 | 窝窝午夜看片 | 国产成人av一区二区三区在线 | 国产a√| 蜜臀av亚洲一区二区 | 一本一道精品欧美中文字幕 | 中文天堂在线播放 | 九九久久精品国产 | 亚洲色偷拍另类无码专区 | 777色淫网站女女免费 | 伊人久久大香线蕉综合影院首页 | 97久久人人 | 久久精品国产亚洲a∨蜜臀 久久精品国产亚洲沈樵 | 最新最近中文字幕 | 人妻夜夜爽天天爽三区 | 亚洲人 女学生 打屁股 得到 | 波多中文字幕 | 久久99精品久久只有精品 | 狠狠色噜噜狠狠狠四色米奇 | 无码av中文一区二区三区桃花岛 | 国产中年夫妇交换高潮呻吟 | 天堂网在线最新版www中文网 | 欧美熟妇另类久久久久久不卡 | 在线中文字幕视频 | 69av在线播放 | 人妻少妇精品无码专区二区 | 色图自拍偷拍 | 国产免费一区二区三区四在线播放 | 精品粉嫩aⅴ一区二区三区四区 | 欧美人与性禽动交情品 | 亚洲自国产拍揄拍 | 粉嫩av一区二区夜夜嗨 | 国产成人久久综合第一区 | 午夜dj在线观看高清在线视频完整版 | 97se综合| 一本大道熟女人妻中文字幕在线 | 亚瑟av在线 | 亚洲女同ⅹxx女同tv | 欧美激情精品成人 | 久久免费福利视频 | 日韩av中文 | 亚洲天堂视频在线观看免费 | 午夜视频网址 | 性盈盈影院中文字幕 | 久久综合网av | 日韩一区二区三区免费视频 | 日本三级带日本三级带66 | 天天综合在线观看 | 性欧美丰满熟妇xxxx性仙踪林 | 网曝91综合精品门事件在线 | 五月婷婷丁香 | 中文韩国午夜理伦三级好看 | 免费看黄网站在线观看 | 国产精品jizz在线观看网站 | 成人在线观看a | 国产传媒av | 精品久久久久国产免费第一页 | 国产精品久草 | 亚洲欧洲一区二区 | 亚洲欧美日韩一区在线观看 | 亚洲第一无码专区天堂 | 国产69精品久久久久久野外 | 明星毛片 | 香蕉伊蕉伊中文视频在线 | 欧美 亚洲 另类 偷偷 自拍 | 日本肉体xxxx裸体xxx免费 | 好大好湿好硬顶到了好爽视频 | 国产精品青青草 | av无码精品一区二区三区四区 | 免费a级毛片在线播放 | 国产主播中文字幕 | 中文字幕免费在线观看视频 | 亚洲字幕av一区二区三区四区 | 自拍偷拍在线播放 | a毛片在线 | 久久99精品久久久久久秒播 | 一区二区三区在线 | 欧 | 国产成人精品免费视频大全 | 欧美性猛交ⅹxx乱大交 | 午夜在线观看网站 | 久久精品国产99国产精品澳门 | 超碰97在线资源 | 99久久婷婷国产综合精品青草免费 | 国产成人精品一二三区 | 在线看片网址 | 99爱在线视频这里只有精品 | 少妇av一区二区三区无码 | 九九热精品视频在线观看 | 99热这里只有精品免费播放 | 国产xxxx视频在线观看 | 精品一区二区三区在线视频 | 日韩伦理一区二区三区 | 日韩av影片在线观看 | 亚洲蜜桃av一区二区 | 97久久超碰中文字幕 | 在线视频这里只有精品 | 亚洲一区二区三区写真 | 免费理伦片在线播放网站 | 日韩精品成人免费观看视频 | 一区二区三区四区精品 | 国产簧片 | 自拍偷拍av| 日日摸日日干 | 翔田千里一区二区 | 欧美性色黄大片a级毛片视频 | 日韩不卡一区二区 | 单亲与子性伦刺激对白视频 | 国产麻豆一精品一av一免费 | 亚洲综合激情网 | 久久久久久自慰出白浆 | 国产精品一区二区无线 | 免费麻豆av | 在线免费看a | 精品www日韩熟女人妻 | 女性向小h片资源在线观看 女性隐私黄www网站视频 | 奇米影视亚洲狠狠色 | 人人看人人舔 | 色八戒av | 日韩视频免费看 | 欧美成人综合视频 | 成 人 黄 色 视频播放165 | 99久久无色码中文字幕人妻 | 日批在线播放 | 国产亚洲精品久久久久久久久动漫 | 色在线视频 | 91老女人| 人妻熟女一区二区三区app下载 | 四虎国产在线 | 九九综合九九综合 | 色呦呦中文字幕 | 夜夜爽爽爽久久久久久魔女 | www春色 | 亚洲欧美一区二区三区不卡 | 日本高清免费视频 | 不卡的av在线 | 中文在线免费视频 | 毛片无码一区二区三区a片视频 | 一个添下面两个吃奶把腿扒开 | 有一婷婷色 | 怡红院a∨人人爰人人爽 | 麻豆视频在线免费看 | 国产激情久久久久久 | 色操插 | 99热99精品 | av资源新版在线天堂 | 国产成人片无码视频在线观看 | 国产91边播边对白在线 | 九九热爱视频精品 | 91精品一久久香蕉国产线看观看新通道出现 | √天堂资源在线 | 樱花草在线播放免费中文 | 中日韩精品视频在线观看 | 亚洲欧美在线视频免费 | 亚洲三级国产 | 国产aⅴxxx片 | 国产精品亚洲欧美大片在线看 | 中国美女一级看片 | 日韩美女乱淫aaa高清视频 | 夜夜夜夜bbbbbb欧美 | 国产视频一区二区三区四区 | 57pao国产精品一区 | 中文精品一区二区三区四区 | 日本少妇xxx做受 | 国产免费又黄又爽又色毛 | 色先锋资源久久综合5566 | 国产视频不卡 | 成人18视频 | 久草福利 | chinese少妇啪啪高潮 | 色综合天 | 白嫩丰满少妇xxxxx性视频 | 巨胸挤奶视频www网站 | 嫩草影院黄 | 一级片免费网站 | 极品久久 | 中文字幕丰满乱子伦无码专区 | 外国av在线 | juliaannxxxxx高清| 日日摸夜夜骑 | 天堂资源在线 | 亚洲精品系列 | 成人午夜视频精品一区 | 99精品一区二区三区无码吞精 | 黑人好猛厉害爽受不了好大撑 | 亚洲国产a∨无码中文777 | 天摸夜夜添久久精品亚洲人成 | 久久免费精品国自产拍网站 | 久久人妻少妇嫩草av | 手机av免费 | 亚洲日韩av无码一区二区三区 | 日本猛少妇色xxxxx猛叫小说 | 国产五区 | 精品无码久久久久久久动漫 | 999久久久国产精品消防器材 | 国产精品99999 | 亚洲一级免费视频 | 国产精品日本一区二区不卡视频 | 午夜视频网站 | 国产午夜精品一区二区三区嫩草 | yy8男人的天堂 | 午夜小视频免费观看 | 亚洲午夜激情 | 美国成人免费视频 | 夜色www国产精品资源站 | 亚洲一区二区不卡视频 | av资源在线看 | 特级毛片网站 | 看免费真人视频网站 | 久久久一级 | 国产免费又硬又黄又爽的视频喷水 | 国产福利精品视频 | 欧美性xxxx极品hd大豆行情 | 成人欧美18 | 暴力调教一区二区三区 | 亚洲欧美日韩中文在线 | 亚洲中文字幕无码av永久 | 国产极品美女高潮无套 | 非洲人成免费视频 | 亚洲成a∨人片在线观看不卡 | 丁香五月欧美成人 | 张津瑜国内精品www在线 | 福利在线视频导航 | 免费人成在线观看网站品爱网 | aaa日本高清在线播放免费观看 | 国产区精品在线观看 | 在线观看成人无码中文av天堂 | 久9re热视频这里只有精品 | 色噜噜狠狠一区二区三区果冻 | 有码中文 | 狠狠五月天| 香蕉视频网站入口 | 亚洲国产精| 337p西西人体大胆瓣开下部 | 国产成人精选视频在线观看 | 我要看一级片 | 美女啪啪网 | 人妻精品国产一区二区 | 精品国产乱码久久久久久影片 | 好紧好湿好黄的视频 | 亚洲国产精品无码久久 | 91成年影院 | 久草综合在线视频 | www好了av| 中日躁夜夜躁 | 国产精品久久久影视青草 | 日韩三级不卡 | 日韩综合av| av激情影院 | 日本三级欧美三级人妇视频黑白配 | 人妻无码第一区二区三区 | 国产精品欧美一区二区三区不卡 | 美女内射毛片在线看免费人动物 | 黄色xxx| 亚洲人成亚洲精品 | 亚洲人成亚洲人成在线观看 | 免费萌白酱国产一区二区三区 | jzzijzzij日本成熟少妇 | 尤物yw193无码点击进入 | 毛片网特黄| 另类国产ts人妖高潮系列视频 | 久久精热 | 午夜嫩草嘿嘿福利777777 | 中文字幕在线观看视频一区 | 色99在线 | aⅴ亚洲 日韩 色 图网站 播放 | 天天躁夜夜躁av天天爽 | 亚洲一区二区三区香蕉 | 亚洲欧美国产另类 | 老汉色老汉首页a亚洲 | a级片在线看 | 日韩69av| 亚洲国产成人精品无码一区二区 | 国产亚洲欧美在线专区 | 中文字幕在线导航 | 久久综合香蕉国产蜜臀av | 亚洲欧美精品一中文字幕 | 精国产品一区二区三区四季综 | 日韩亚洲一区二区三区 | 破了亲妺妺的处免费视频国产 | 性生交大片免费看女人按摩 | 欧美性性性性性色大片免费的 | 国产精品色婷婷久久99精品 | 毛片大全免费看 | 国产欧美在线观看不卡 | 日韩中文在线播放 | 国产精品99久久久久久白浆小说 | 国产乱人偷精品人妻a片 | 蜜桃视频在线观看免费视频网站www | 欧美做爰一区二区三区 | 欧美在线aa| 国产精品初高中害羞小美女文 | 久久精品水蜜桃av综合天堂 | 大乳三级a做爰大乳 | 国产色婷婷五月精品综合在线 | 精品国产露脸对白在线观看 | 日韩欧美在线观看视频 | 交专区videossex农村 | 麻豆一区二区三区蜜桃免费 | 天天做天天摸天天爽天天爱 | 国产寡妇一级农村野外战 | 国产福利酱国产一区二区 | 国产精品亚洲五月天高清 | 国产成人综合美国十次 | 亚洲图片88 | 蜜桃tv一区二区三区 | 日韩精品大片 | 日本久色 | 人妻仑乱少妇av级毛片 |