在 OCI 上使用 OpenTofu 创建 Kubernetes 集群#Kubernetes月
在 Oracle Cloud 注册免费账户,并使用 Terraform 快速轻松地创建 Kubernetes 集群。
访问 此链接并创建您的账户
开始前的重要事项
-
由于免费账户的限制,您可能需要升级到
Pay As You Go
账户才能使用免费的VM.Standard.A1.Flex
实例创建集群。即使升级后也不会被收取任何免费资源的费用。 -
在您的账户中创建一个预算警报,以免被意外收费 预算。
-
不要更改集群使用的实例类型,因为唯一与 OKE 兼容的免费实例是
VM.Standard.A1.Flex
。
安装 OpenTofu
- GNU/Linux
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh -o install-opentofu.sh
chmod +x install-opentofu.sh
./install-opentofu.sh --install-method deb
rm install-opentofu.sh
- Windows
Invoke-WebRequest -outfile "install-opentofu.ps1" -uri "https://get.opentofu.org/install-opentofu.ps1"
& .\install-opentofu.ps1 -installMethod standalone
Remove-Item install-opentofu.ps1
安装 OCI CLI
- GNU/Linux
- 执行安装命令:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
-
当提示更新 PATH 变量时,输入
yes
,它将自动更新 .bashrc 或 .bash_profile 文件。如果您使用其他 shell,需要手动指定 OCI CLI 的路径(例如 ~/zshrc)。 -
重新启动终端会话。
-
验证安装。
oci -v
- Windows
-
在 GitHub Releases 下载适用于 Windows 的 OCI CLI MSI 安装程序
-
运行安装程序并按照说明操作。
安装 Kubectl - Kubernetes 1.28.2
- GNU/Linux
Kubectl 用于与 Kubernetes API 进行命令行交互。我们应该使用与 variables.tf 文件中指定的版本相同的 kubectl 版本。
- 下载 kubectl 二进制文件
curl -LO https://dl.k8s.io/release/v1.28.2/bin/linux/amd64/kubectl
- 安装二进制文件
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
- 添加 kubectl 自动补全
echo '
source <(kubectl completion bash)' >> ~/.bashrc
- 验证版本
kubectl version --client
- 注意: 上述命令将会产生一个警告: "WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short."
您可以忽略此警告。您只是在验证已安装的 kubectl 版本。
- Windows
- 下载 kubectl 二进制文件
curl.exe -LO "https://dl.k8s.io/release/v1.28.2/bin/windows/amd64/kubectl.exe"
-
将 kubectl 二进制文件目录添加到您的环境变量 PATH 中。
-
验证版本
kubectl version --client --output=yaml
认证 OCI
- 首先, 克隆存储库。
git clone https://github.com/Rapha-Borges/oke-free.git
- 创建 API 密钥
- 进入您的个人资料,访问 API 密钥选项卡,然后单击
Add API Key
。
-
选择
Generate API key pair
, 下载私钥。然后单击Add
。 -
下载后, 将密钥移动到
OCI CLI
目录并重命名为oci_api_key.pem
。
- GNU/Linux
mkdir -p ~/.oci && mv ~/Downloads/<文件名>.pem ~/.oci/oci_api_key.pem
- Windows
move C:\Users\<user>\Downloads\<文件名>.pem C:\Users\<user>\.oci\oci_api_key.pem
- 修复私钥权限:
oci setup repair-file-permissions --file <私钥路径>
- 将 API 密钥创建页面上显示的文本复制到
OCI CLI
配置文件。不要忘记将key_file
字段的值替换为私钥的路径。
- GNU/Linux
vim ~/.oci/config
[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fingerprint=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
region=xxxxxxxx
key_file=~/.oci/oci_api_key.pem
- Windows
notepad C:\Users\<user>\.oci\config
[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fingerprint=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
tenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
region=xxxxxxxx
key_file=C:\Users\<user>\.oci\oci_api_key.pem
- 创建
./ssh
目录,并生成 SSH 密钥 (在 Windows 上,使用 Git Bash 运行以下命令)。
ssh-keygen -t rsa -b 4096 -f ./ssh/id_rsa
- 创建一个包含环境变量的文件,用您的帐户信息替换变量值(来自上面 ~/.oci/config 文件的内容)。
- GNU/Linux
vim ./env.sh
export TF_VAR_tenancy_ocid=<您的租户 OCID>
export TF_VAR_user_ocid=<您的用户 OCID>
export TF_VAR_fingerprint=<您的指纹>
export TF_VAR_private_key_path=~/.oci/oci_api_key.pem
export TF_VAR_ssh_public_key=$(cat ssh/id_rsa.pub)
# 如果您想使用不同的配置文件名称,请更改下面的值
export TF_VAR_oci_profile="DEFAULT"
现在运行脚本以导出变量:
source ./env.sh
- Windows
在 Windows 上,您可以创建一个 env.bat
文件,内容如下,然后运行该文件导出变量。
set TF_VAR_tenancy_ocid=<您的租户 OCID>
set TF_VAR_user_ocid=<您的用户 OCID>
set TF_VAR_fingerprint=<您的指纹>
set TF_VAR_private_key_path=C:\Users\<user>\.oci\oci_api_key.pem
set TF_VAR_ssh_public_key=C:\Users\<user>\.oci\ssh\id_rsa.pub
# 如果您想使用不同的配置文件名称,请更改下面的值
set TF_VAR_oci_profile="DEFAULT"
现在运行该文件以导出变量:
env.bat
创建集群
- 安装模块
tofu init
- 创建集群。
tofu apply
- 注意:您可以选择性地使用
tofu plan
命令来查看执行tofu apply
之前将要进行的更改。使用以下命令:
tofu plan -out=oci.tfplan
tofu apply -auto-approve "oci.tfplan"
- 编辑
~/.kube/config
文件, 按以下示例添加使用API KEY
进行身份验证:
- name: user-xxxxxxxxxx
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: oci
args:
- ce
- cluster
- generate-token
- --cluster-id
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- --region
- xxxxxxxxxxx
- --auth # 添加这一行
- api_key # 添加这一行
- --profile # 添加这一行
- DEFAULT # 添加这一行
- 访问集群。
kubectl get nodes
创建集群的脚本
注意: 该脚本正在测试中, 仅在 Linux 上运行。
如果您想自动化集群创建过程, 只需执行项目根目录下的 main.sh 脚本。该脚本将生成 SSH 密钥, 将公钥添加到 TF_VAR, 初始化 Terraform 并创建集群。
./main.sh
负载均衡器
我们创建的集群已经配置了一个网络负载均衡器, 用于在端口 80 上暴露应用程序。只需配置一个类型为 NodePort
的服务, 将端口设置为 80
, 将节点端口设置为 30080
。可以在 manifests
目录中找到配置服务的示例。
负载均衡器的地址在执行结束时以 public_ip = "xxx.xxx.xxx.xxx"
的格式给出, 您随时可以使用以下命令查看:
tofu output public_ip
删除集群
- 要删除集群, 只需运行以下命令:
tofu destroy
已知问题
-
如果您尝试使用免费账户创建集群, 并收到以下错误
Error: "Out of capacity" or "Out of host capacity"
免费账户有有限的可用实例数量, 您尝试创建集群的区域可能没有更多可用的实例。您可以等待直到有新的实例可用, 或者尝试在另一个区域创建集群。另外, 升级到 Pay As You Go
账户可能会解决这个问题, 因为 Pay As You Go
账户有更多可用的实例。即使升级后, 您也不会被收取任何使用免费资源的费用。
-
错误
401-NotAuthenticated
或者kubectl
命令无法使用。这是因为身份验证令牌已过期。
生成一个新的身份验证令牌, 并将其导出到 OCI_CLI_AUTH
环境变量。
oci session authenticate --region us-ashburn-1
- Linux
export OCI_CLI_AUTH=security_token
- Windows
set OCI_CLI_AUTH=security_token
-
由于
tofu destroy
执行失败, 导致无法删除集群和所有资源。或者出现诸如Error Code: CompartmentAlreadyExists
之类的错误无法解决
要解决此问题, 只需在 OCI 控制台中手动删除资源。按照以下顺序进行:
注意: 如果看不到要删除的集群或 VPN, 请确保选择了正确的隔离区 k8s
。