前置作業完成後,接下來先進行:
1. 使用 kops 在 AWS 上部署叢集
請注意:以下範例因使用到 ec2 t3.medium
類型的執行個體,並非免費 💸💸💸!
請注意:以下範例因使用到 ec2 t3.medium
類型的執行個體,並非免費 💸💸💸!
請注意:以下範例因使用到 ec2 t3.medium
類型的執行個體,並非免費 💸💸💸!
回顧一下 Day17 我們有安裝的 kops,這個工具有點類似我們用 kubectl 在叢集操作 pods,不過這邊是操作 AWS 上建立的叢集而非叢集的資源。
今天要來使用 kops 在 AWS 建構 k8s 叢集。
叢集示意圖:
在 AWS 啟動三個 ec2 執行個體:
接下來在使用 kops 在 AWS 建立叢集時要做一些環境的設定:
為 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)上查看。
使用剛剛指令建立的 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)
使用 Gossip based DNS 這邊就不用特別設定。
一般情況是需要一個 domain 去存取 kubernetes API,就需要有一個 domain(可能需要額外花費)。
輸入以下指令建立 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
輸入以下命令並執行。
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"}}]}'
準備環境變數,因為是使用 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。