
[Day21] k8s實務篇(二):EKS架設k8s(下)
Author: Nick Zhuang
Type: kubernetes
前言
上篇的部分:AWS的基礎設置、創建k8s的控制介面(Yesterday)
下篇的部分:kubectl的安裝與設置、登入EC2的工作節點(Today)
昨天我們看了上篇,今天我們延續 上篇 的內容,開始介紹下篇的部分,沒看過上篇的朋友,務必先看過。
kubectl的安裝與設置
這個部分是要將你用的電腦下載kubectl這個套件,並綁定AWS的服務,我們接續著昨天的設定繼續操作。
實務上基本你也不會把minikube的環境和AWS的集群環境混在一起,當初的設計就是先在minikube群集測試,如果沒有問題再上AWS測試,不過在整個流程中還是有些部分可以優化,你可以透過Drone CI/CD的流程去簡化你在Docker內開發、打包、部署等等的工作。
理想的情況下,是把minikube設置在本地電腦,而AWS群集是在區網內的另外一台電腦可見、可操作,提供一個小型的集成開發環境。
對於不太熟悉虛擬機和一般作業系統差異的朋友,可以參考: 第二天的內容
因為筆者之前在mac OS的機器上已經裝了minikube,為了保證環境的隔離性,就另外裝了VirtualBox,並在裡面新增了Ubuntu的環境,因此接下來的操作,都是在該環境內進行的,請特別留意。
VirtualBox的相關設置
開始之前的設置
我們不會透過這個圖形介面操作,因為在mac環境的指令要貼過去很麻煩,所以我們會換個做法:
- 利用圖形化介面設置ssh
- 直接透過ssh連到ubuntu操作
底下示範操作:
確認ubuntu的ip

可以注意到ip是172.20.10.5,而網路介面是enp0s3
將ssh的service安裝到ubuntu

確認ssh的service狀態

OK,確認無誤,我們先把Ubuntu關掉

設置VirtualBox的網路
網卡一:

網卡二:

接著啟動VirtualBox,直接把那個畫面縮小
我們從命令列登入
$ssh nick@192.168.99.100
nick@192.168.99.100's password:
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
407 packages can be updated.
283 updates are security updates.
New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Sun Oct 6 15:32:38 2019 from 192.168.99.1
nick@nick-VirtualBox:~$OK,可以用了,相信有人注意到這個IP是跟minikube的ip是一樣的,這個IP是可以改的,設定靜態IP,可以參考 這裡
安裝kubectl到Ubuntu
以下皆是在虛擬機的ubuntu操作喔!
接著就要延續上個章節的內容了,我們這邊要:
從AWS安裝kubectl
$curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.8/2019-08-14/bin/linux/amd64/kubectl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
16 37.3M 16 6383k 0 0 475k 0 0:01:20 0:00:13 0:01:07 550k這會花點時間,取決於網路速度,我們等它一下,好了進到下一步
賦予kubectl執行權限
$ chmod +x ./kubectl
$ mv ./kubectl /usr/local/bin環境設定
$mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
$echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc檢查kubectl版本
$kubectl version --short --client
Client Version: v1.13.11-eks-5876d6安裝 aws-iam-authenticator
下載程式
$curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.13.8/2019-08-14/bin/linux/amd64/aws-iam-authenticator
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
49 17.7M 49 8958k 0 0 487k 0 0:00:37 0:00:18 0:00:19 1415k賦予該程式執行權限
$chmod +x ./aws-iam-authenticator環境設置
$mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
#$echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc檢查程式
$aws-iam-authenticator help
A tool to authenticate to Kubernetes using AWS IAM credentials
Usage:
aws-iam-authenticator [command]
Available Commands:
help Help about any command
init Pre-generate certificate, private key, and kubeconfig files for the server.
server Run a webhook validation server suitable that validates tokens using AWS IAM
token Authenticate using AWS IAM and get token for Kubernetes
verify Verify a token for debugging purpose
version Version will output the current build information
Flags:
-i, --cluster-id ID Specify the cluster ID, a unique-per-cluster identifier for your aws-iam-authenticator installation.
-c, --config filename Load configuration from filename
-h, --help help for aws-iam-authenticator
-l, --log-format string Specify log format to use when logging to stderr [text or json] (default "text")
Use "aws-iam-authenticator [command] --help" for more information about a command.檢查Token
這邊我們透過剛安裝的authenticator去驗證,###的部分在 之前 下載的accessKeys.csv裡面
$vim ~/.aws/credentials
[default]
aws_access_key_id=###
aws_secret_access_key=###
region=ap-southeast-1
output=json接著使用這個檔案透過API取得Token
$aws-iam-authenticator token -i EKS-cluster |python -m json.tool
{
"apiVersion": "client.authentication.k8s.io/v1alpha1",
"kind": "ExecCredential",
"spec": {},
"status": {
"expirationTimestamp": "2019-10-06T09:34:49Z",
"token": "k8s-aws-v1.aHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS8_QWN0aW9uPUdldENhbGxlcklkZW50aXR5JlZlcnNpb249MjAxMS0wNi0xNSZYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUE2UTZHMjNXWjJCM1BESDdNJTJGMjAxOTEwMDYlMkZ1cy1lYXN0LTElMkZzdHMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDE5MTAwNlQwOTIwNDlaJlgtQW16LUV4cGlyZXM9MCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QlM0J4LWs4cy1hd3MtaWQmWC1BbXotU2lnbmF0dXJlPWE0NWI3ZWIxMzZmYzQwNzE5YzAzZjY5OTllNmE2NjRmNjNkYmEzYzBjNTA3MDRhOGM5NjgwOTAwODY1YjYyM2Y"
}
}安裝awscli並驗證
至少要1.16.156以上的版本,下面要設置會比較容易~
$pip3 install awscli --upgrade --user
$aws --version
aws-cli/1.16.253 Python/3.5.2 Linux/4.15.0-42-generic botocore/1.12.243驗證eks-cluster的設置
$aws eks describe-cluster --name eks-cluster設置kubectl的config
將<>範圍的字串用EKS上的cluster對應資訊抽換掉
$vim ~/.kube/config-eks
apiVersion: v1
clusters:
- cluster:
server: <API server endpoint>
certificate-authority-data: <Certificate authority>
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: aws
name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
user:
exec:
apiVersion: client.authentication.k8s.io/v1alpha1
command: aws-iam-authenticator
args:
- "token"
- "-i"
- "eks-cluster"
# - "-r"
# - "<role-arn>"
# env:
# - name: AWS_PROFILE
# value: "<aws-profile>"好了之後,檢查下
$kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1mOK,設置到這邊就結束囉!我們看一個Topic~
登入EC2的工作節點
前一段我們已經把集群架設起來了,接著我們要做的事,就是要把Work Node加到集群中。
先回到AWS Management Console,進到CloudFormation

接著新增一個Stack,這個Stack是Node Group

其中的eks-nodegroup.yaml可以從 這裡 下載
再來是一些其他參數的設定

注意到AMI的部分,這個需要最佳化設定,參考 這裡

三個Subnet都要放上去

大致這樣,好了下一步,按Next
後面只是總覽,不用改,直接Create Stack就好

要稍等一下,好了之後我們去看一下EC2,那邊會有三台機器開起來

我們到Security Group那邊的NodeGroup去加個SSH的設置

檢查Instance的IP

這樣的話,就能利用前面的eks.pem連進去囉
$ssh -i ~/.ssh/eks.pem ec2-user@54.179.135.5我們檢查下節點狀態
$kubectl get no
No resources found看樣子還沒結束,要在k8s集群裡面改ConfigMap才能確保節點順利加入
$vim aws-auth.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: aws-auth
namespace: kube-system
data:
mapRoles: |
- rolearn: <role-arn-from-previous-step>
username: system:node:{{EC2PrivateDNSName}}
groups:
- system:bootstrappers
- system:nodes其中<<role-arn-from-previous-step>>要換成下方反白內容

好了apply一下,官方有說這個檔案的其他內容最好不要亂動
$kubectl apply -f aws-auth.yaml
configmap "aws-auth" configured最後我們可以看到集群的節點狀態
$kubectl get no
NAME STATUS ROLES AGE VERSION
ip-192-168-4-101.ap-southeast-1.compute.internal Ready <none> 10m v1.13.8-eks-cd3eb0
ip-192-168-54-227.ap-southeast-1.compute.internal Ready <none> 10m v1.13.8-eks-cd3eb0
ip-192-168-77-210.ap-southeast-1.compute.internal Ready <none> 10m v1.13.8-eks-cd3eb0OK,雲端AWS的集群設置完畢了!
小祕技:用eksctl架設集群
如果你覺得這樣設置實在累到爆,筆者傳授必殺技給你
我們其實可以直接利用eksctl設置,讓我們感受一下
下載並安裝eksctl
$curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$sudo mv /tmp/eksctl /usr/local/bin
$eksctl version
[ℹ] version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.6.0"}eksctl架設群集
創建一個新群集,名稱是eks-cluster,3個節點,使用新加坡的網域
$eksctl create cluster --name=eks-cluster --nodes=3 --region=ap-southeast-1這會花一點時間,大概要20分左右
前面不提的原因是,如果一開始就這樣設置了,那麼發生問題的時候,因為AWS元件熟練度不足,會要花更多時間排錯^_^
小結
今天我們看到了雲端AWS集群的架設方式,下卷結束了,整體來說介紹應該算蠻完整的,我們也學習到了eksctl初步的使用,它可以讓我們快速的架設群集,跟Kops速度上感覺差不多,當然目前感覺Kops的控制項還是比較多的,明天開始會在雲端的群集操作了,我們可以開始看到雲端和區網的不同,加油!明天見了!
參考資料
- ●
- ●
- ●
- ●
- ●
- ●
- ●
- ●