iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
DevOps

第一次參賽就學 Kubernetes系列 第 18

[Day 18] 在 AWS 部署 Kubernetes 叢集 (二) - 使用 kops 在 AWS 上部署叢集 (建立叢集)

  • 分享至 

  • xImage
  •  

前置作業完成後,接下來先進行:

1. 使用 kops 在 AWS 上部署叢集

請注意:以下範例因使用到 ec2 t3.medium 類型的執行個體,並非免費 💸💸💸!
請注意:以下範例因使用到 ec2 t3.medium 類型的執行個體,並非免費 💸💸💸!
請注意:以下範例因使用到 ec2 t3.medium 類型的執行個體,並非免費 💸💸💸!

回顧一下 Day17 我們有安裝的 kops,這個工具有點類似我們用 kubectl 在叢集操作 pods,不過這邊是操作 AWS 上建立的叢集而非叢集的資源。

今天要來使用 kops 在 AWS 建構 k8s 叢集。


建立叢集

叢集示意圖:

https://ithelp.ithome.com.tw/upload/images/20231004/20162511zppMHNXgXL.png

在 AWS 啟動三個 ec2 執行個體:

  • 一個 master
  • 兩個 worker nodes

環境設定

接下來在使用 kops 在 AWS 建立叢集時要做一些環境的設定:

  1. 設定 IAM user → kops 使用
  2. 設定 DNS → 在 Route53 建立子網域的 nameserver (或使用 gossip-based DNS 方式)
  3. 建立 S3 bucket → 用來存放叢集 state 資料
  4. 建立 S3 OIDC bucket
  5. 建立叢集

1. 設定 IAM 使用者

為 kops 設定一個 IAM 使用者,使用者會需要下列權限:

AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
AmazonSQSFullAccess
AmazonEventBridgeFullAccess

一開始先進行 AWS CLI 驗證設定,這邊使用 AdministratorAccess 的角色資訊來做驗證,點開「Command line or programmatic access」,依據個人電腦系統,我這邊點選「macOS and Linux」Tab,複製「 Option 1: Set AWS environment variables (Short-term credentials)」內的驗證資訊到終端機上並執行。

執行以下命令建立 IAM 使用者。

aws iam create-group --group-name kops

aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonSQSFullAccess --group-name kops
aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEventBridgeFullAccess --group-name kops

aws iam create-user --user-name kops

aws iam add-user-to-group --user-name kops --group-name kops

aws iam create-access-key --user-name kops

{
    "Group": {
        "Path": "/",
        "GroupName": "kops",
        "GroupId": "xxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxx:group/kops",
        "CreateDate": "2024-01-03T03:49:04+00:00"
    }
}
{
    "User": {
        "Path": "/",
        "UserName": "kops",
        "UserId": "xxxxxxxxxxxxxxx",
        "Arn": "arn:aws:iam::xxxxxxxx:user/kops",
        "CreateDate": "2024-01-03T03:49:33+00:00"
    }
}
{
    "AccessKey": {
        "UserName": "kops",
        "AccessKeyId": "xxxxxxxxxxxxxxx",
        "Status": "Active",
        "SecretAccessKey": "xxxxxxxxxxxxxxx",
        "CreateDate": "2024-01-03T03:49:41+00:00"
    }
}

會建立好 IAM user,可以在 AWS 主控台(IAM)上查看。

https://ithelp.ithome.com.tw/upload/images/20231006/20162511BflRNlmW0W.png

使用剛剛指令建立的 access key 來設定 IAM user。

# ... 輸入剛才上述指令產生的 access key id、secret access key、region 和 output format
aws configure
AWS Access Key ID [****************4IMG]: xxxxxxxxxxxxxxxxx
AWS Secret Access Key [****************JCCF]: xxxxxxxxxxxxxxxxx
Default region name [us-east-1]:
Default output format [json]:

因為 aws configure 不會匯出環境變數,需要額外匯出給 kops 使用。

export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

2. 設定 DNS

使用 Gossip based DNS 這邊就不用特別設定。
一般情況是需要一個 domain 去存取 kubernetes API,就需要有一個 domain(可能需要額外花費)。

3. 建立 S3 bucket

輸入以下指令建立 bucket。

aws s3api create-bucket --bucket kops-state-20240101 --region us-east-1
{
    "Location": "/kops-state-20240101"
}

如果 region 不是 us-east-1 則需要加上參數 --create-bucket-configuration LocationConstraint=<region>

啟動 bucket 的版控 (versioning)。

aws s3api put-bucket-versioning --bucket kops-state-20240101 --versioning-configuration Status=Enabled

4. 建立 S3 OIDC bucket

輸入以下命令並執行。

aws s3api create-bucket \
    --bucket kops-oidc-state-20240101 \
    --region us-east-1 \
    --object-ownership BucketOwnerPreferred
aws s3api put-public-access-block \
    --bucket kops-oidc-state-20240101 \
    --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false
aws s3api put-bucket-acl \
    --bucket kops-oidc-state-20240101 \
    --acl public-read
{
    "Location": "/kops-oidc-state-20240101"
}

預設 bucket 加密。

aws s3api put-bucket-encryption --bucket kops-state-20240101 --server-side-encryption-configuration '{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'

5. 建立叢集

準備環境變數,因為是使用 gossip-based 叢集,NAME 一定要是 k8s.local 結尾。

export NAME=mycluster.k8s.local
export KOPS_STATE_STORE=s3://kops-state-20240101

查看在區域(region)中,叢集的可用區域(available zone)有哪些,等等在建立叢集時需指定可用區域。

aws ec2 describe-availability-zones --region us-east-1
{
    "AvailabilityZones": [
        {
            "State": "available",
            "OptInStatus": "opt-in-not-required",
            "Messages": [],
            "RegionName": "us-east-1",
            "ZoneName": "us-east-1a",
            "ZoneId": "use1-az6",
            "GroupName": "us-east-1",
            "NetworkBorderGroup": "us-east-1",
            "ZoneType": "availability-zone"
        },
        {
            "State": "available",
            "OptInStatus": "opt-in-not-required",
            "Messages": [],
            "RegionName": "us-east-1",
            "ZoneName": "us-east-1b",
            "ZoneId": "use1-az1",
            "GroupName": "us-east-1",
            "NetworkBorderGroup": "us-east-1",
            "ZoneType": "availability-zone"
        },
... 以下省略

可用區域(available zone)是每個區域(region)內的多個隔離位置。每個 region 底下會有多個 AZ (data center)。

上述指令會列出很多可用區域,使用其中的 us-east-1a

執行以下命令會產生建立叢集的設定(還不是真正的建立)。

kops create cluster \
    --name=${NAME} \
    --cloud=aws \
    --zones=us-east-1a \
    --node-count=2 \
    --discovery-store=s3://kops-oidc-state-20240101/${NAME}/discovery

建立叢集。

kops update cluster --name ${NAME} --yes --admin

執行以下指令確認叢集是否正常運作,此時會需要等一些時間。

kops validate cluster --wait 10m

NODE STATUS
NAME                    ROLE            READY
i-06e28e09e8c59e824     node            True
i-075493dae795c7a24     control-plane   True
i-0c00cf6b2e7b64548     node            True

Your cluster mycluster.k8s.local is ready

從 k8s v1.18 開始 kOps 預設使用的 image 是官方的 Ubuntu 20.04,這個類型的 ec2 執行個體有在 AWS 免費方案中。但在上述的指令 kops create cluster 沒特別指定執行個體類型,預設會是使用 t3.medium (非免費)。

嘗試使用指令看一下叢集目前的狀況。

alias k="kubectl"

$ k get no
NAME                  STATUS   ROLES           AGE     VERSION
i-06e28e09e8c59e824   Ready    node            6m8s    v1.28.4
i-075493dae795c7a24   Ready    control-plane   7m40s   v1.28.4
i-0c00cf6b2e7b64548   Ready    node            6m      v1.28.4

列出在 kube-system namespace 底下的 Pods,可以看見 k8s 的各項元件。

$ k get po -n kube-system
NAME                                            READY   STATUS    RESTARTS        AGE
aws-cloud-controller-manager-7g2ns              1/1     Running   0               7m5
aws-node-termination-handler-5784fcb4f4-rm7ms   1/1     Running   2 (6m40s ago)   7m5
cilium-22xd2                                    1/1     Running   0               7m5
cilium-g988z                                    1/1     Running   0               7m1
cilium-n6ngp                                    1/1     Running   0               7m1
cilium-operator-79b845cf8c-sl679                1/1     Running   0               7m5
coredns-6dd4f8d684-kbkww                        1/1     Running   0               6m3
coredns-6dd4f8d684-wrz5g                        1/1     Running   0               7m5
coredns-autoscaler-578cbcb7fd-tb7qv             1/1     Running   0               7m5
dns-controller-69d784f64-vk6zg                  1/1     Running   0               7m5
ebs-csi-controller-b744ff758-bpcpk              5/5     Running   0               7m5
ebs-csi-node-cbdmm                              3/3     Running   0               7m1
ebs-csi-node-gtj2r                              3/3     Running   0               7m5
ebs-csi-node-r4tm5                              3/3     Running   0               7m1
etcd-manager-events-i-075493dae795c7a24         1/1     Running   0               8m3
etcd-manager-main-i-075493dae795c7a24           1/1     Running   0               8m3
kops-controller-wm67l                           1/1     Running   0               7m5
kube-apiserver-i-075493dae795c7a24              2/2     Running   2 (9m14s ago)   7m3
kube-controller-manager-i-075493dae795c7a24     1/1     Running   4 (8m53s ago)   8m3
kube-scheduler-i-075493dae795c7a24              1/1     Running   0               8m3

接著下一篇會在叢集上部署 nginx。


參考來源

  1. Kops - Getting Started with kOps on AWS
  2. DevOps Tutorials | How to create Kubernetes cluster on AWS using kOps and S3 Storage | AWS Tutorial

上一篇
[Day 17] 在 AWS 部署 Kubernetes 叢集 (一)
下一篇
[Day 19] 在 AWS 部署 Kubernetes 叢集 (三) - 使用 kops 在 AWS 上部署叢集 (部署程式)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言