how to install azure cli

what is Azure CLI

Azure 命令列介面 (CLI) 是跨平台命令列工具,可連線到 Azure 並在 Azure 資源上執行系統管理命令。 其允許透過終端機使用互動式命令列提示或指令碼來執行命令。
若要進行互動式使用,你必須先在 Windows 上啟動 cmd.exe 之類的殼層,或在 Linux 或 macOS 上啟動 Bash,然後在殼層提示字元發出命令。 若要自動化重複的工作,你可以使用所選殼層的腳本語法,將 CLI 命令組合成殼層腳本,然後執行腳本。

How to Use

在mac上安裝,如果沒有Homebrew就去安裝

1
2
$ brew update && brew install azure-cli
# 如果在M1上 brew要改成 arch -arm64 brew

安裝完之後,執行

1
$ az login

會跳出瀏覽起進行驗證登入,就直接在瀏覽器中操作後,再回到console,會看到驗證資訊了~

參考連結

az cli install

az cli 命令

how to install k8s on aws

install k8s on aws

AWS安裝集群有很多種方式,今天教大家使用eksctl進行部署集群,其中部署集群的Node有分linux或者Fargate,不管是哪種部署,都是很方便的。

  • AWS Fargate 是一項技術,可以與 Amazon ECS 搭配使用以執行容器,而不需管理 Amazon EC2 執行個體的伺服器或叢集。使用 Fargate,就不再需要佈建、設定或擴展虛擬機器的叢集來執行容器。這樣一來即無須選擇伺服器類型、決定何時擴展叢集,或最佳化叢集壓縮。
  • Linux就是使用EC2去建立你的Node,這邊就不贅述。
  • Note: Fargate 特性關係,就無法使用 Daemonset

記得要先安裝好 eksctl 和 kubectl
如果都已安裝好了,那就開始建立cluster吧
1
2
3
4
5
6
7
8
9
10
11
$ eksctl create cluster # 建立cluster
--name test-cluster # cluster 名稱
--nodegroup-name test-nodes # 指定 aws-node 的群組名稱
--node-type t3.small # 指定工作者節點使用的執行個體類型
--nodes 3 # 指定node數量
--nodes-min 1 #針對節點群組設定 Amazon EC2 Autoscaling 組態中的節點數目下限
--nodes-max 4 #針對節點群組設定 Amazon EC2 Autoscaling 組態中的節點數目上限
--managed # 建立 Amazon EKS 受管節點群組
--version 1.20 # 指定K8S版本
--region us-east-2 # AWS 區域
# --fargate # 如果你要建立fargate類型,請多加 --fargate

Note: 命令執行i 會在你的本機下 ~/.kube/config 建立組態檔案,也稱為 kubeconfig。kubeconfig 包含有關 Amazon EKS 叢集的詳細資訊,包括叢集名稱和身分驗證方法


等待並確認是否安裝cluster成功

開始建立


你會看到你的EKS建立一個新的集群出來了


點選cluster進去,會看到node是你所開的機器類型


再到EC2就會看到你剛建立的group

如果你建立的是fargate類型,那就不會看到EC2開立

基本上以上確認就算是成功了~接下來我們來試試看一個簡單的例子,放上k8s裡吧

建立ECR的image

  1. 用之前gcp的簡單範例,建立image
1
$ vi Dockerfile
1
2
3
4
5
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ docker build -t 185271018684.dkr.ecr.us-east-2.amazonaws.com/hello-node:v1 .

$ aws ecr create-repository --repository-name hello-node
#輸出
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-2:185271018684:repository/hello-node",
"registryId": "185271018684",
"repositoryName": "hello-node",
"repositoryUri": "185271018684.dkr.ecr.us-east-2.amazonaws.com/hello-node",
"createdAt": "2022-05-23T13:50:04+08:00",
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}

  1. 擷取上方的 repositoryUri 值,並建立tag。
1
$ docker tag hello-node:v1 185271018684.dkr.ecr.us-east-2.amazonaws.com/hello-node:v1

  1. 執行 aws ecr get-login-password 命令,如此us-west-2 區域的範例中所示

    1
    $ aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 185271018684.dkr.ecr.us-west-2.amazonaws.com/hello-node:v1
  2. push

    1
    $ docker push 185271018684.dkr.ecr.us-east-2.amazonaws.com/hello-node:v1

你可以到ECR畫面中確認,應該已經出現hello-node:v1,把URI位置複製下來吧~

Note: Mac M1下build的image會有問題,請務必使用linux系統編譯


執行kubectl,讓image進入k8s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: web
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: hello-node
image: 185271018684.dkr.ecr.us-east-2.amazonaws.com/hello-node:v1
ports:
- containerPort: 8080

建立k8s deployment

1
2
$ kubectl apply -f deployment-hello.yaml 
$ kubectl get deployment

建立service,AWS會自動給予LB endpoint


1
$ kubectl expose deployment web-deployment --type=LoadBalancer --name=demo-aws-service --port 8080

執行連結

參考文獻

AWS EKS入門


AWS ECR

fig Terminal

what is fig

Fig 讓你在 Terminal 裡輸入 command 時,自動列出相關的參數/檔案/記錄。
有了這個,可以減少很多查 man page 的時間。


How to Use

mac 安裝起手式

1
2
3
4
5
6
7
8
9
10
$ brew install fig
==> Caveats
Please launch the Fig application to finish setup...

==> Downloading <https://versions.withfig.com/fig%20421.dmg>
######################################################################## 100.0%
==> Installing Cask fig
==> Moving App 'Fig.app' to '/Applications/Fig.app'
==> Linking Binary 'fig-darwin-universal' to '/usr/local/bin/fig'
🍺 fig was successfully installed!

裝完後要運行APP



跟你要求權限


會要求收集一些資訊


註冊一下~你會收到驗證信


設定頁面

參考連結

fig

how to install kubectl

what is kubectl

命令列工具,適用於使用 Kubernetes 叢集,是針對k8s下指令的工具,client要創建或刪除東西,都是透過該工具下指令。

How to Use

基本上如果你的k8s架設在雲端上,在mac上均需要安裝kubectl,再透過CLI去存取你的k8s集群~

  1. 透過 Homebrew 安裝
    1
    $ brew install kubectl 

  1. 確認是否安裝完成
    1
    $ kubectl cluster-info 

補充: 為了讓kubectl能夠發現並訪問Kubernetes集群,你需要一個kubeconfig文件, 該文件在創建集群時,會自動產生。 通常,kubectl 的配置文件存放在

~/.kube/config


  1. 開啟 shell 自動補全功能
    1
    2
    $ echo "source <(kubectl completion zsh)" >> ~/.zshrc
    $ source ~/.zshrc

參考連結

install kubectl

how to login eks

這邊記錄一下,假設你已經有AWS的EKS叢集,若你想要在不同的地方進行登入時,所需要進行的步驟:

  • 確認當前的開發機器上,AWS CLI與eksctl 均已安裝,並且是最新的,而AWS CLI與kubectl的版本有點關係,可以看看這issue , 主要解法就是更新一下CLI並重新 set config

  • 如果你是叢集的建立者
  1. 若要查看你的 AWS CLI 使用者或角色的組態,請執行以下命令:
    1
    2
    3
    4
    5
    6
    $ aws sts get-caller-identity
    {
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/testuser"
    }

  1. 確認你的arn相符

  1. set你的kubeconfig,注意,需要用正確的IAM身份執行
    1
    2
    3
    4
    5
    # 將 eks-cluster-name 取代為你的叢集名稱。將 aws-region 取代為你的 AWS 區域
    $ aws eks update-kubeconfig --name eks-cluster-name --region aws-region

    # 或者連同ARN一起設定
    $ aws eks update-kubeconfig --name eks-cluster-name --region aws-region --role-arn arn:aws:iam::XXXXXXXXXXXX:role/testrole

  1. 確認kubeconfig是否已經更新
    1
    $ kubectl config view --minify

  1. 若要確認你的 IAM 使用者或角色是否經驗證
    1
    $ kubectl get svc



  • 如果你不是叢集建立者
  1. 查看你的角色,取得你的arn
    1
    $ aws sts get-caller-identity

  1. 交給你的管理員,透過管理員編輯 aws-auth ConfigMap

    1
    $ kubectl edit configmap aws-auth -n kube-system

  2. 管理員將新arn填入,格式如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 將 testuser 取代為你的使用者名稱
    # arn 取代為拿到的arn
    mapUsers: |
    - userarn: arn:aws:iam::XXXXXXXXXXXX:user/testuser
    username: testuser
    groups:
    - system:masters

    # 將 IAM 角色新增到 mapRoles
    # 將 testrole 取代為你的角色
    # arn 取代為拿到的arn
    mapRoles: |
    - rolearn: arn:aws:iam::XXXXXXXXXXXX:role/testrole
    username: testrole
    groups:
    - system:masters

    # mapRoles 部分中 username 的值僅接受小寫字元。 映射該 IAM 角色時應該略去路徑,因為 rolearn 不支援路徑。
    # system:masters 群組允許進階使用者存取對任何資源執行任何動作。

打完收工~應該就可以登入了~

參考連結

aws login

how to install eksctl

what is eksctl

命令列工具,適用於使用 EKS 叢集,可自動執行許多個別任務。

How to Use

還沒安裝 Homebrew的,請先安裝

1
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

安裝 Weaveworks Homebrew tap。

1
$ brew tap weaveworks/tap

安裝或升級eksctl

1
2
3
4
5
# 未安裝
$ brew install weaveworks/tap/eksctl

#已安裝
$ brew upgrade eksctl && brew link --overwrite eksctl

確認是否安裝成功

1
2
$ eksctl version
0.97.0

參考連結

install eksctl

how to install aws cli

要使用aws公有雲,aws cli是一個很方便的工句,跟之前有介紹gcp的cli一樣,可以幫助你自動化很多的建置,今天以mac為例子,教大家如何安裝aws-cli,之後再透過aws-cli建立k8s集群。

what is AWS CLI

AWS Command Line Interface (AWS CLI) 是開放原始碼工具,可讓你在命令列 Shell 中使用命令來與 AWS 服務互動。
只需最少的組態,AWS CLI 就可以讓你在終端程式中,從命令提示字元開始執行可實作相當於瀏覽器型 AWS Management Console 所提供功能的命令。

why is AWS CLI

AWS CLI 能夠直接存取 AWS 服務的公有 API。 你可以利用 AWS CLI 探索服務的功能,並開發 Shell 指令碼來管理資源。
除了低階的 API 同等命令,有幾個 AWS 服務還提供 AWS CLI 自訂功能。自訂功能可能包括較高階的命令,可簡化具有複雜 API 的服務使用。
所以使用起來會更方便建立自動化流程。

How to Use

先下載 aws-cli ,直接點選開啟安裝。

接著就不管3721,就直接選取預設選項




確認一下安裝位置與是否安裝成功

1
2
$ which aws
/usr/local/bin/aws
1
2
$ aws --version
aws-cli/2.2.44 Python/3.8.8 Darwin/20.5.0 exe/x86_64 prompt/off

成功拉~
接下來如果要建立k8s集群,還需要kubectl和eksctl,下一篇繼續。
記得配一下config~

1
2
3
4
5
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json

參考連結

aws cli doc

how to install gcloud

what is gcloud

Google 提供一個很好用的 CLI 介面工具,讓我們可以用指令的方式控制 GCP 的資源。

why is gcloud

雖然Google有提供好用的介面,但有時候可能會需要一些自動化,因此,透過gcloud cli,能夠完成更困難的自動化建置,例如自動建立GKE或GCE等等。

How to Use

請到google下載頁面(參考最下方的參考連結),記得選擇你要的OS,這邊以M1為例子,並進行解壓縮,你會得到google-cloud-sdk的資料夾

1
cd google-cloud-sdk && sh ./install.sh
1
sh ./bin/gcloud init

一開始會要求你進行認證,請選擇你的google帳號,就會開始進行配置了。看你是要新建專案還是用現有專案來使用。


安裝完畢後可以確認一下

1
gcloud version

參考連結

gcloud download

install k8s cluster on gcp

這邊介紹如何在GCP上安裝k8s cluster,整體而言,會參考之前GCP架構。

整體步驟

1.準備一支Node.js應用程式

2.建立 Docker container image

3.把image推送並儲存在Container Registry

4.建立GKE Cluster,部署Hello Node

5.讓應用程式上線expose

開始前準備好GCP帳號與gcloud的client安裝

可以參考之前寫的內容

#開啟 cloud shell

用vi指令建一個Node.js檔案

vi server.js

1
2
3
4
5
6
7
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello World!");
}
var www = http.createServer(handleRequest);
www.listen(8080);

接著執行

1
node server.js

並在右上角的網頁預覽,可以進行預覽


開始建立image

vi Dockerfile

1
2
3
4
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js

用以下指令建立image,andylab-343008是你的projectID
1
docker build -t gcr.io/andylab-343008/hello-node:v1 .   

過程中會要求授權


等待並且看到成功建立image

你可以執行一下docker指令,確認是否正常

1
docker run -d -p 8080:8080 gcr.io/andylab-343008/hello-node:v1

一樣透過網頁預覽,可以開啟網頁,同樣是看到Hello,World!就是成功了,就可以先暫時停止~

docker stop <CONTAINER ID>


把建立的image上傳到GCR

GCR (Google Container Registry),它是一個專門放image的地方。
這時候要用我們上面提到的gcloud來進行了~

先啟用GCR API服務


如果沒有啟用會收到錯誤訊息

gcloud docker -- push gcr.io/andylab-343008/hello-node:v1

等待


結束後至GCR的GUI介面查看,會發現多了一個image


建立K8s Cluster

一樣要使用厲害的gcloud來建置, 首先先確保你的gcloud 所在的project是你想要的。

1
gcloud config set project YOUR_PROJECT_ID 

先開啟 API service - container.googleapis.com 不然會無法建立cluster唷~
1
gcloud services enable container.googleapis.com

開始建立cluster,等待~

1
gcloud container clusters create hello-world --num-nodes 2 --zone asia-east1-a --machine-type n1-standard-1

成功拉~

前往GKE確認一下

將image 部署至 GKE上

先建立簡單的yaml試驗,之後再針對k8s講解~

vi deployment-hello.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: hello-node
image: gcr.io/andylab-343008/hello-node:v1
ports:
- containerPort: 8080
1
2
kubectl apply -f deployment-hello.yaml 
kubectl get deployment

確認有建立了deployment

為了讓你的image對外露出,建立service

1
kubectl expose deployment web-deployment --type LoadBalancer --port 8080 

需等待一下,你會先看到Pending,這是很正常的~

過幾分鐘後,會發現Pending變成IP了~

去GCP的網路服務-負載平衡確認,跑出一個LB拉~

於瀏覽器執行IP~

結語

於公有雲上建立K8S相對容易許多,
這邊大家僅需要學習如何於GCP上建立K8S既可,
對於不熟悉K8S的人,可以先照著做~
後續在詳細的介紹docker與K8S。

參考連結

gcp lab

install k8s cluster on Ubuntu

本文將介紹如何安裝k8s到Ubuntu,在安裝前請先準備三個虛擬機,你可以透過virtualbox進行安裝,以下規格可以參考:

Server Type Hostname Specs
Master k8s-master01 4GB Ram, 2vcpus
Worker k8s-worker01 4GB Ram, 2vcpus
Worker k8s-worker02 4GB Ram, 2vcpus

安裝步驟

  • 針對Ubuntu進行配置
  • 安裝docker
  • 安裝kubeadm、kubectl以及kubelet
  • 建立並初始化 master 節點
  • 建立並將 worker 節點加入

針對Ubuntu進行配置

  • 先關掉 swap

    1
    2
    sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    sudo swapoff -a

  • 接著啟用內核模組與配置sysctl

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Enable kernel modules
    sudo modprobe overlay
    sudo modprobe br_netfilter

    # Add some settings to sysctl
    sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF

    # Reload sysctl
    sudo sysctl --system

  • 更新一下,並重新開機

    1
    2
    3
    sudo apt update
    sudo apt -y full-upgrade
    [ -f /var/run/reboot-required ] && sudo reboot -f

install docker 並且修改一下cgroups


cgroups是啥呢,你可以把它理解成一個進程處理隔離工具,docker就是用它来實現容器的隔離的。docker 默認使用的是cgroupfs,
而 k8s 也用到了一个進程隔離工具systemd,如果使用兩個隔離工具的話可能會引起異常,所以必須要把 docker 的也改成systemd。

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
33
34
# 更新並安裝相關所需套件
sudo apt update
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

# 增加repo
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 更新並安裝docker
sudo apt update
sudo apt install -y containerd.io docker-ce docker-ce-cli

# 建立資料夾
sudo mkdir -p /etc/systemd/system/docker.service.d

# 建立 daemon json config 文件,並填入內容
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

# 重啟docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

# 檢查是否安裝與修改成功
docker info | grep Cgroup

install kubelet, kubeadm and kubectl

為每一個節點都安裝 kubelet, kubeadm and kubectl

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt -y install curl apt-transport-https

# 增加repo
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新並且安裝相關所需套件
sudo apt update
sudo apt -y install vim git curl wget kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# 確認是否安裝成功
kubectl version --client && kubeadm version

建立並初始化master節點

1
2
3
4
# 初始化
kubeadm init \
--apiserver-advertise-address=192.168.0.1 \
--pod-network-cidr=192.168.0.0/16

--apiserver-advertise-address: k8s 中的主要節點的apiserver的位置,填自己的節點 ip
--pod-network-cidr: k8s內部的網路

這時候你會看到類似以下圖片的結果,記得把最後一句join記下來


建立並將 worker 節點加入

ssh 進入worker,並執行剛剛的join語法。

確認

1
kubectl get nodes 

參考連結

第一千零一篇的 cgroups 介紹


Install Kubernetes Cluster on Ubuntu 20.04 with kubeadm