使用Terraform在Oracle的IaaS上创建Kubernetes集群
这是什么?
以下是在Oracle Cloud Infrastructure(简称OCI,Oracle的IaaS)上构建Kubernetes集群的步骤。
在这个教程中,我们将使用Oracle作为OSS公开的基于Terraform的Kubernetes安装程序。
(2018/06/29更新)
由于OCI控制台的用户界面已经进行了部分更改,因此本条目的屏幕图像与实际控制台不同。
请注意,屏幕图像中在控制台顶部的标签和左侧的菜单导航已经被更改为展开左上角的汉堡菜单来操作)
只需要一个选项:能够确认动作的条件。
-
- クラウド
North America リージョンのDCが有効なOracle Cloudアカウントがあること
ローカルPC
Ubuntu 16.04(多分Macでもいける)
Oracle Cloud提供了一种试用帐户,您可以免费使用云订阅服务35000分钟(截至2018/03/03)。这个教程也可以在上述试用帐户上进行。
在试用账户登录时,将默认数据中心/地区设为北美,可以使本教程的执行更加顺利。
整体的动态
大致的步骤流程如下所示。
-
- 在OCI上做准备工作
-
- 使用基于Terraform的Kubernetes安装程序构建Kubernetes集群
- 设置客户端以访问集群环境
1. 在OCI上的准备工作。
首先,我们将在OCI上创建用于Kubernetes的区域(Compartment)以及该区域的管理员帐户等所需资源。
1-1. 创建 API 访问密钥
在后续的步骤中,我们使用Kubernetes安装程序来实现其功能,它利用OCI的API。为了使用该API,需要在OCI侧设置适当的访问密钥。
在这里,我们将创建一个用作上述访问密钥的密钥对。
> mkdir ~/.oci
> openssl genrsa -out ~/.oci/oci_api_key.pem 2048
Generating RSA private key, 2048 bit long modulus
........................................................+++
..................................+++
e is 65537 (0x10001)
> chmod go-rwx ~/.oci/oci_api_key.pem
> openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem
> ls .oci/
oci_api_key.pem oci_api_key_public.pem
在OCI上创建所需的资源。
我将通过操作OCI的服务控制台来创建所需的资源,如Compartment等。
1-2-1. 访问OCI的服务控制台
登录Oracle云的仪表盘,在仪表盘界面上,按顺序点击“Compute”面板右下角的菜单图标,然后点击“打开服务控制台”。
如果没有显示”Compute”面板,请点击位于屏幕上半部分蓝色区域内的”仪表板定制”,以启用”Compute”面板的显示。
创建一个1-2-2的隔间
Compartment是OCI租户内部的隔间,可以通过在其中放置各种资源或分配策略给Compartment来管理账户权限。
在这里,我们将创建一个用于配置Kubernetes集群的Compartment,用于放置各种资源。
首先,在OCI服务控制台的右上方的选项卡中,点击“身份”。
在画面左侧的菜单中点击“Compartment”,然后再点击“创建Compartment”按钮。
在“创建隔离区”对话框中设置以下值,然后点击“创建隔离区”按钮。
-
- NAME: k8s
-
- DESCRIPTION: k8s on OCI
- (上記以外はデフォルトのまま)
以上,Compartment的创建工作已经完成。
创建用于管理Compartment的管理员账户组。
创建一个用于管理Compartment管理员帐户的群组。
在画面左侧的菜单点击“群组”,然后再点击“创建群组”按钮。
在“创建群组”对话框中设置以下数值,然后点击“提交”按钮。
-
- NAME: k8s_administrators
-
- DESCRIPTION: k8s administrators
- (上記以外はデフォルトのまま)
以上是管理员账户组的创建完成。
创建适用于Group的Policy
通过设置所需的策略,可以将权限分配给目标群组。
在此例中,我们将创建一个用于分配给管理员帐户群组的策略。在此策略中,我们将拥有对组件的全权限。
请点击画面左侧的菜单中的”政策”选项。
在屏幕的左下角的”List Scope”菜单中选择”k8s”的容器。然后,点击”Create Policy”按钮。
在”创建策略”对话框中,按照以下方式设置数值,然后点击”创建”按钮。
-
- NAME: k8s_admin_policy
-
- DESCRIPTION: Grants users full permissions on the k8s compartment
-
- Policy Statements
STATEMENT: Allow group k8s_administrators to manage all-resources in compartment k8s
(上記以外はデフォルトのまま)
以上,已经完成了适用于Group的Policy的创建。
创建1-2-5区域的管理员用户
我们将创建一个用于管理此Compartment的用户。
通过将此用户分配到用于管理员帐户的组中,使其对Compartment拥有完全权限。另外,通过设置在步骤1中创建的API访问密钥,使得该用户可以以其权限从外部执行OCI的API操作。
在画面左侧的菜单中点击“用户”,然后再点击“创建用户”按钮。
在”创建用户”对话框中设置以下值,然后点击”创建”按钮。
-
- NAME: k8s_admin
-
- DESCRIPTION: k8s administrator
- (上記以外はデフォルトのまま)
在用户列表页面上,点击”k8s_admin”。
在左下角的菜单中点击“群组”,然后再点击“添加用户到群组”按钮。
在“添加用户到组”对话框中,选择“k8s_administrators”。
在画面的左下角菜单中,点击“API Keys”,然后点击“Add Public Key”按钮。
在“添加公钥”对话框中,将步骤1-1中创建的公钥字符串~/.oci/oci_api_key_public.pem粘贴到“PUBLIC KEY”文本框中。
> cat ~/.oci/oci_api_key_public.pem (<-- この結果表示される文字列をコピー/ペースト)
请最后点击“添加”按钮。
以上完成了创建Compartement管理员用户的任务。
收集Kubernetes安装程序所需的各种值
为了让Kubernetes安装程序能够访问该Compartment,需要以下数值。
-
- APIアクセスキーのFingerprint
-
- OCIのテナントのOCID
-
- Compartmentの管理者のOCID
-
- CompartmentのOCID
- データセンターのリージョン
OCID是OCI中各种资源的标识符。我们将从OCI服务控制台中收集这些值。
首先,在创建用户后的界面中,获取添加的API访问密钥的指纹和租户的OCID。
前者在名为”API Keys”的标题列表中,租户的OCID在界面的页脚中显示,因此将这些值复制/粘贴到文本编辑器中备用。
向上滚动屏幕,可以在“用户信息”选项卡中找到OCID信息。
点击“复制”按钮,该用户(区块管理员)的OCID将被复制到剪贴板上,您可以将其粘贴到文本编辑器中保存。
接下来是Compartment的OCID。点击屏幕左上角的面包屑导航栏中的”身份”。
在画面左侧的菜单中,点击“组件”,将显示“组件”列表。
在列表中,点击“k8s”的“复制”,将把此组件的OCID复制到剪贴板,然后可以将其粘贴到文本编辑器等位置。
最后是数据中心区域。您可以在服务控制台的页头中确认。在后续步骤中将其输入。
以上で、工作在OCI的服务控制台中已完成。
2. 建立 Kubernetes 集群
使用OCI的Terraform基于Kubernetes的安装程序(Terraform Kubernetes Installer),在OCI上构建Kubernetes集群。
2-1. 安装Terraform Kubernetes Installer
首先,我们将设置一个可以使用Terraform Kubernetes Installer的环境。
安装Terraform
安装Terraform。根据使用的计算机平台下载官方二进制文件,并将其添加到PATH即可。要确认下载的二进制文件的URL,请参考官方下载页面。
以下是在Ubuntu 16.04上安装的示例。
> wget https://releases.hashicorp.com/terraform/0.11.3/terraform_0.11.3_linux_amd64.zip
> unzip terraform_0.11.3_linux_amd64.zip
> sudo mv terraform /usr/local/bin/
我将确认是否正确安装。
> terraform --version
Terraform v0.11.3
2-1-2. 安装 terraform-provider-oci.
为了操作OCI,安装一个用于Terraform的插件。根据使用的个人电脑平台,下载适当的插件。从Github的Releases页面确认下载的URL。
这是在Ubuntu 16.04上安装的一个示例。
> wget https://github.com/oracle/terraform-provider-oci/releases/download/2.0.7/linux.tar.gz
> tar xvf linux.tar.gz
将Terraform插件放置在~/.terraform.d/plugins目录中。如果该目录不存在,则创建一个新的。
> mkdir -p ~/.terraform.d/plugins
最后,将插件的主体复制到上面的目录中。
> mv linux_amd64/terraform-provider-oci_v2.0.7 ~/.terraform.d/plugins/
准备 Terraform Kubernetes 安装程序 2-1-3 。
克隆 Terraform Kubernetes Installer。
> git clone -b v1.3.0 https://github.com/oracle/terraform-kubernetes-installer.git
> cd terraform-kubernetes-installer/
通过上述步骤,已经创建了一个运行Terraform Kubernetes Installer的环境。
为Terraform Kubernetes Installer设置参数的配置。
使用Terraform的参数文件terraform.tfvars来修改基于OCI构建的Kubernetes配置的设置。
复制基本参数文件,然后进行编辑。
> cp terraform.example.tfvars terraform.tfvars
> vim terraform.tfvars
在参数文件的开头,有一个部分记录了OCI环境信息和API访问密钥的设置信息。我们将会修改这些参数以与1-3中收集到的信息相匹配。
另外,我们还需要在这里指定1-1中创建的API访问密钥(私钥文件)的路径和要使用的OCI区域。
对象的参数如下所示。
另外,我们会对Kubernetes每个节点的形态和防火墙设置进行配置。请参考Terraform Kubernetes Installer文档了解每个参数的详细信息。
以下是参数文件的描述示例。
这个设置允许对节点进行SSH,并且允许从互联网访问节点,以便在构建后的环境中更容易进行检查。请注意,这只是用于操作验证的设置。
2018/06/29的補充:在OCI目前並沒有提供預設的作業系統映像,因此需要使用xxx_ol_image_name參數來指定作業系統映像。
# BMCS Service
tenancy_ocid = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
compartment_ocid = "ocid1.compartment.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
fingerprint = "00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
private_key_path = "/home/hhiroshell/.oci/oci_api_key.pem"
user_ocid = "ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
region = "us-ashburn-1"
# CCM user
#cloud_controller_user_ocid = "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
#cloud_controller_user_fingerprint = "00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff"
#cloud_controller_user_private_key_path = "/tmp/bmcs_api_key.pem"
etcdShape = "VM.Standard1.2"
k8sMasterShape = "VM.Standard1.2"
k8sWorkerShape = "VM.Standard1.2"
# OS image names for Master/Workder/etcd/nat
master_ol_image_name = "Oracle-Linux-7.5-2018.06.14-0"
worker_ol_image_name = "Oracle-Linux-7.5-2018.06.14-0"
etcd_ol_image_name = "Oracle-Linux-7.5-2018.06.14-0"
nat_ol_image_name = "Oracle-Linux-7.4-2018.06.14-0"
etcdAd1Count = "1"
etcdAd2Count = "1"
etcdAd3Count = "1"
k8sMasterAd1Count = "1"
k8sMasterAd2Count = "1"
k8sMasterAd3Count = "1"
k8sWorkerAd1Count = "1"
k8sWorkerAd2Count = "1"
k8sWorkerAd3Count = "1"
#etcdLBShape = "100Mbps"
#k8sMasterLBShape = "100Mbps"
etcd_ssh_ingress = "0.0.0.0/0"
etcd_cluster_ingress = "0.0.0.0/0"
master_ssh_ingress = "0.0.0.0/0"
worker_ssh_ingress = "0.0.0.0/0"
master_https_ingress = "0.0.0.0/0"
worker_nodeport_ingress = "0.0.0.0/0"
control_plane_subnet_access = "public"
k8s_master_lb_access = "public"
natInstanceShape = "VM.Standard1.2"
#nat_instance_ad1_enabled = "true"
#nat_instance_ad2_enabled = "false"
#nat_instance_ad3_enabled = "true"
nat_ssh_ingress = "0.0.0.0/0"
public_subnet_http_ingress = "0.0.0.0/0"
public_subnet_https_ingress = "0.0.0.0/0"
#worker_iscsi_volume_create is a bool not a string
#worker_iscsi_volume_create = true
#worker_iscsi_volume_size = 100
#etcd_iscsi_volume_create = true
#etcd_iscsi_volume_size = 50
执行Terraform Kubernetes Installer。
终于开始执行Terraform Kubernetes Installer来构建集群。
首先进行terraform init。
> terraform init
…
Terraform has been successfully initialized!
计划。
> terraform plan
...
Plan: 46 to add, 0 to change, 0 to destroy.
在这个阶段,实际的环境配置尚未完成。如果一切顺利,且没有出现错误,最后执行terraform apply来开始构建环境。
> terraform apply
構築需要一些时间。在此期间,您可以查看OCI的服务控制台,确认Kubernetes所需的网络和节点的创建情况。
以下是显示网络资源的示例。在屏幕右上方的选项卡菜单中点击”Network”,然后在屏幕左侧的COMPARTMENT列表中选择”k8s”即可显示。
以下是显示Compute Instance资源的示例。在屏幕右上方的选项卡菜单中点击”Compute”,然后在屏幕左侧的COMPARTMENT列表中选择”k8s”即可显示。
2-4. 確認連接
您可以使用附带的连接检测脚本来确认集群是否正常构建。
以下是脚本在集群构建尚未完成的情况下的执行结果示例。
> scripts/cluster-check.sh
[cluster-check.sh] Running some basic checks on Kubernetes cluster....
[cluster-check.sh] Checking SSH connectivity to each node (from this host)...
[cluster-check.sh] Checking whether instance bootstrap has completed on each node...
[cluster-check.sh] [FAILED] cloud-init has not finished running on master xxx.xxx.xxx.xxx
[cluster-check.sh] If this does not complete soon, log into the BMC instance and examine the /var/log/cloud-init-output.log file.
当集群构建完成后,将显示以下结果。
> scripts/cluster-check.sh
[cluster-check.sh] Running some basic checks on Kubernetes cluster....
[cluster-check.sh] Checking SSH connectivity to each node (from this host)...
[cluster-check.sh] Checking whether instance bootstrap has completed on each node...
[cluster-check.sh] Checking Flannel's etcd key from each node...
[cluster-check.sh] Checking whether expected system services are running on each node...
[cluster-check.sh] Checking status of /healthz endpoint at the LB...
[cluster-check.sh] Running 'kubectl get nodes' a number of times through the master LB...
[cluster-check.sh] Checking status of kube-dns pod...
[cluster-check.sh] Checking an app deployment of nginx exposed as a service...
The Kubernetes cluster is up and appears to be healthy.
Kubernetes master is running at https://xxx.xxx.xxx.xxx:443
KubeDNS is running at https://xxx.xxx.xxx.xxx:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
2-7. 清理工作
要删除集群,请运行terraform destroy。
> terraform destroy
通过以上步骤,我们成功在OCI上搭建了Kubernetes集群。
3. 如何访问环境
我们将通过kubectl和SSH访问我们在上面步骤中构建的Kubernetes集群。
3-1. 使用 kubectl
kubectl的配置文件会自动在Terraform Kubernetes Installer的生成目录中生成。在执行kubectl时,只需使用该配置文件即可。
这个例子是指定环境变量KUBECONFIG来设置配置文件路径的方法。
> export KUBECONFIG=~/terraform-kubernetes-installer/generated/kubeconfig
我們將使用一個命令來獲取集群的一般信息,以確認其運作情況。如果返回以下類似的回應,則表示我們已成功訪問集群。
> kubectl cluster-info
Kubernetes master is running at https://xxx.xxx.xxx.xxx:443
KubeDNS is running at https://xxx.xxx.xxx.xxx:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
3-2. SSH
Secure Shell (SSH)
要访问配置Kubernetes节点的SSH,首先需要从Terraform的状态信息中提取SSH的密钥,并创建密钥。
> mkdir ssh
> terraform output ssh_private_key >ssh/private_key
> chmod 600 ssh/private_key
您还可以从Terraform的状态信息中获取Node的IP地址。
> terraform output worker_public_ips
> terraform output master_public_ips
> terraform output etcd_public_ips
只需使用此私钥将其连接到节点的SSH,但在访问节点时,帐户名必须为”opc”。
> ssh -i ssh/private_key opc@xxx.xxx.xxx.xxx
通过使用Terraform,在Oracle的IaaS上成功创建了Kubernetes集群。辛苦了!