Planet Linux of Taiwan - People

09月24日

AppleBOY's Blog's face
AppleBOY's Blog


縮小 展開

用 Kubernetes 將 Drone CI/CD 架設在 AWS

Screen Shot 2017-09-24 at 12.53.39 AM Drone 是我今年主推的 CI/CD 自架服務,詳細可以參考這篇文章,目前在公司內部團隊使用了一年以上,服務相當穩定。Drone 本身可以透過 docker-compose 方式快速在機器上架設完成,但是由於 Kubernetes 的盛行,大家也希望能透過 Kubernetes 來安裝 Drone 服務。本篇會教大家如何在 AWS 上透過 Kubernetes 安裝完成。Drone 預設使用 SQLite 當作資料庫,檔案會直接存放在 /var/lib/drone 路徑底下,但是容器內不支援寫入,所以必須要要額外掛上空間讓 Drone 可以寫入資料。此篇會以 GitHub 認證 + SQLite 來教學。

事前準備

  1. 在 AWS 上面 建立 kubernets
  2. 在 AWS 上面建立 EBS 空間存放 SQLite
  3. 申請 GitHub OAut
在安裝 Drone 之前,有三件事情務必先完成,第一是要先有 K8S 環境,本篇不會教大家如何架設出 K8S 環境。但是你可以透過官方提供的方式來測試:
  1. 使用 Minikube (快速在本機端架設出 K8S Cluster)
  2. Katacoda
  3. Play with Kubernetes (單次免費四小時)
第二,你需要先在 AWS 上面建立一個 1G 的 EBS 空間,空間大小由你決定,你可以透過 AWS CLI 或直接到 AWS Console 頁面建立,底下是建立 EBS 的指令
$ aws ec2 create-volume \
  --availability-zone=ap-southeast-1a \
  --size=1 --volume-type=gp2
注意 availability-zone 區域要跟 K8S 同樣,大小先設定 1G。完成後會看到底下訊息:
{
    "AvailabilityZone": "ap-southeast-1a",
    "Encrypted": false,
    "VolumeType": "gp2",
    "VolumeId": "vol-04741f74eb0f6b891",
    "State": "creating",
    "Iops": 100,
    "SnapshotId": "",
    "CreateTime": "2017-09-23T15:42:24.319Z",
    "Size": 1
}
之後會用到 VolumeId。假如沒有做此步驟,您會發現 Drone 伺服器是無法啟動成功。最後是請到 GitHub 帳號內建立一個全新 OAuth App,並取得 CLientSecret 代碼。

安裝 Drone

所有的 Yaml 檔案都可以直接在 appleoy/drone-on-kubernetes,找到。首先打開 drone-server-deployment.yaml,找到 volumeID 取代成上述建立好的結果。
  awsElasticBlockStore:
    fsType: ext4
    # NOTE: This needs to be pointed at a volume in the same AZ.
    # You need not format it beforehand, but it must already exist.
    # CHANGEME: Substitute your own EBS volume ID here.
-   volumeID: vol-xxxxxxxxxxxxxxxxx
+   volumeID: vol-01f13b969e9dabff7
再來設定 server 跟 agent 溝通用的 Secret,打開 drone-secret.yaml
data:
-  server.secret: ZHJvbmUtdGVzdC1kZW1v
+  server.secret: ZHJvbmUtdGVzdC1zZWNyZXQ=
透過 base64 指令換掉上面的代碼。假設密碼設定 drone-test-secret,請執行底下指令
$ echo -n "drone-test-secret" | base64
ZHJvbmUtdGVzdC1zZWNyZXQ=
在 GitHub 上面建立新的 Application,並且拿到 Client ID 跟 Secret Key,修改 drone-configmap.yaml 檔案
server.host: drone.example.com
server.remote.github.client: xxxxx
server.remote.github.secret: xxxxx
接著陸續執行底下指令,新增 Drone NameSpace 並且將 server 及 agent 服務啟動
$ kubectl create -f drone-namespace.yaml
$ kubectl create -f drone-secret.yaml
$ kubectl create -f drone-configmap.yaml
$ kubectl create -f drone-server-deployment.yaml
$ kubectl create -f drone-server-service.yaml
$ kubectl create -f drone-agent-deployment.yaml
完成後,k8s 會自動建立 ELB,透過 kubectl 可以看到 ELB 名稱
$ kubectl --namespace=drone get service -o wide
執行後看到底下結果:
NAME            CLUSTER-IP      EXTERNAL-IP
drone-service   100.68.89.117   xxxxxxxxx.ap-southeast-1.elb.amazonaws.com
拿到 ELB 網域後,可以直接更新 GitHub 的 application 資料 Screen Shot 2017-09-23 at 3.40.28 PM 最後打開瀏覽器,填入上述的網址,會發現直接轉到 GitHub OAuth 認證,點選確認後,Drone 會開始讀取您的個人資料,這樣就代表成功了。

懶人包安裝

上述步驟是不是有點複雜,要執行的 kubectl 指令非常多,所以我提供了另一種安裝方式,就是透過 [install-drone.sh],執行這 Shell Script 檔案前,你必須先做兩件事情。1. 申請 EBS 空間,完成後請修改 drone-server-deployment.yaml 內的 volumeID。2. 申請 [GitHub OAuth Application][42],完成後請修改 drone-configmap.yaml 內的 GitHub 設定。最後執行底下指令
$ ./install-drone.sh

擴展 agent 服務

假設一個 agent 已經不符合團隊需求,在 k8s 內只要一個指令就可以自動水平擴展 agent:
$ kubectl scale deploy/drone-agent \
  --replicas=2 --namespace=drone
其中 replicas 可以改成你要的數字。

如何清除 Drone 服務

我們已經將 Drone 資料庫備份在 EBS,所以隨時都可以移除 Drone 服務,透過簡單的指令就可以清除掉 Drone 所有容器,只要下清除 Namespace 即可
$ kubectl delete -f drone-namespace.yaml

歡迎追蹤 drone-on-kubernetes

後記

這算是我的第一篇 Kubernetes 心得文,就先拿 Drone 服務來測試看看。Drone 作者也很用心寫了一個接口讓 K8S 可以監控 agent 容器,假如您不是使用 SQLite 而是用 MySQL 資料庫,就需要修改 YAML 設定檔。對於本篇文章有不懂的地方,歡迎大家留言。我也錄製了 15 分鐘影片放在 Udemy Drone 課程,課程到月底特價 1600 元。優惠代碼: DEVOPSTAIPEI

09月22日

瘋狂帽客's Blog's face
瘋狂帽客's Blog


縮小 展開

How can I switch multi-user or graphical mode via one command? (Systemd)

To switch multi-user to graphical mode (runlevel 3 to runlevel 5)

# systemctl set-default graphical && reboot




To switch graphical to multi-user mode (runlevel 5 to runlevel 3)

# system set-default multi-user && reboot


09月21日

sakananote's face
sakananote


縮小 展開

Pure-ftpd with openSUSE Leap 42.2 小記

Pure-ftpd with openSUSE Leap 42.2 小記

OS: openSUSE Leap 42.2

安裝相關套件
# zypper  -n  install   pure-ftpd   yast2-ftp-server
正在載入套件庫資料...
正在讀取已安裝的套件...
正在解決套件相依性...

將會安裝下列 4 個新的套件:
 libmysqlclient18 libpq5 pure-ftpd yast2-ftp-server

4 要安裝的新套件.
全部下載大小:1017.5 KiB。已快取:0 B。 完成操作後,將使用額外的 4.6 MiB。
要繼續嗎? [y/n/...? 顯示所有選項] (y): y

# systemctl  status  pure-ftpd
● pure-ftpd.service - Pure-FTPd FTP server
  Loaded: loaded (/usr/lib/systemd/system/pure-ftpd.service; disabled; vendor preset: disabled)
  Active: inactive (dead)

這次預計使用虛擬使用者的方式, 所以使用 sed 將相關設定開啟

# sed  -i  's/# PureDB  /PureDB/g'   /etc/pure-ftpd/pure-ftpd.conf

CreateHomeDir  這個參數我有啟動, 但是實際上還是沒有自動建立
# sed  -i  's/#CreateHomeDir/CreateHomeDir/g'    /etc/pure-ftpd/pure-ftpd.conf

建立一個群組給之後虛擬使用者使用

# groupadd  virtualgrp

建立一個使用者 virtualuser 來讓之後的虛擬使用者使用
# useradd  -g  virtualgrp  -m  virtualuser

使用 pure-pw  來建立虛擬使用者 sakana

# pure-pw   useradd  sakana   -u   virtualuser  -d  /home/virtualuser/sakana  -m
Password:
Enter it again:
  • -u 使用者 UID
  • -d 使用者家目錄
  • -m 更新 db, 好處是不用再去下 pure-pw  mkdb


非互動的方式建立 虛擬使用者sakana, 方便日後使用 ansible 或是其他方式

#  ( echo passwd; echo passwd)  |  pure-pw   useradd  sakana   -u   virtualuser  -d  /home/virtualuser/sakana  -m
  • passwd 為要設定給 sakana 的密碼, 請自行調整


觀察相關資訊
# ls   /etc/pure-ftpd/
pure-ftpd.conf  pureftpd.passwd  pureftpd.pdb vhosts

建立 DB
# pure-pw  mkdb

# ls   /etc/pure-ftpd/
pure-ftpd.conf  pureftpd.passwd  pureftpd.pdb  vhosts

因為 CreateHomeDir 這個參數沒有生效, 所以手動建立使用者家目錄

# mkdir  /home/virtualuser/sakana

修改相關權限( 對應到之前建立的使用者與群組 )
# chown  virtualuser:virtualgrp   /home/virtualuser/sakana/

更改 pure-ftpd 的設定, 取消只讓匿名使用者登入的設定, 使用驗證機制
# sed  -i  's/AnonymousOnly/#AnonymousOnly/g'  /etc/pure-ftpd/pure-ftpd.conf


啟動 pure-ftpd 服務

# systemctl  start  pure-ftpd


觀察相關資訊

# systemctl  status  pure-ftpd
● pure-ftpd.service - Pure-FTPd FTP server
  Loaded: loaded (/usr/lib/systemd/system/pure-ftpd.service; disabled; vendor preset: disabled)
  Active: active (running) since 二 2017-09-19 16:34:56 CST; 14s ago
 Process: 4695 ExecStart=/usr/sbin/pure-config.pl /etc/pure-ftpd/pure-ftpd.conf --daemonize (code=exited, status=0/SUCCESS)
Main PID: 4698 (pure-ftpd)
   Tasks: 1 (limit: 512)
  CGroup: /system.slice/pure-ftpd.service
          └─4698 pure-ftpd (SERVER)


設定開啟啟動 pure-ftpd
# systemctl  enable  pure-ftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/pure-ftpd.service to /usr/lib/systemd/system/pure-ftpd.service.

觀察相關資訊

# systemctl  is-enabled  pure-ftpd
enabled


列出目前的使用者

# pure-pw  list
sakana              /home/virtualuser/sakana/./

觀察相關使用者資訊

# pure-pw  show  sakana

相關指令
# pure-pw  userdel  使用者帳號


Reference




09月18日

瘋狂帽客's Blog's face
瘋狂帽客's Blog


縮小 展開