Kubernetes Kops初学者指南

让我们学习一下 Kops,这是一个 Kubernetes 运维工具。

Kubernetes 是最受欢迎的 DevOps 工具之一,因为它拥有令人惊叹的容器编排系统和功能。但是,尽管 Kubernetes 提供了许多功能,但从头开始设置 Kubernetes 集群是非常痛苦的。这就是 Kops 出现的地方。

使用 Kops,在 AWS、Google Cloud 等云提供商上创建一个 Kubernetes 集群非常简单。它使得设置 Kubernetes 集群变得轻松无压力,在本文中,我将讨论这个令人惊艳的工具。

Kops 是什么?

Kops,也被称为 Kubernetes 运维,是一个开源的官方 Kubernetes 项目,允许您创建、维护、升级和销毁一个高可用的生产级 Kubernetes 集群。它还根据需求提供云基础设施。Kops 的开发人员将其描述为 Kubernetes 集群的 kubectl。

Kops 主要用于部署 AWS 和 GCE Kubernetes 集群。Kops 正式支持只有 AWS,其他云提供商如 DigitalOcean、GCE 和 OpenStack 处于测试阶段。

如果您之前使用过 kubectl,那么在 Kops 上工作会感觉很舒适。Kops 提供命令来创建、获取、更新、删除集群。此外,Kops 知道如何应用现有集群中的更改,因为它使用声明性配置。使用 Kops,您还可以扩展和缩减 Kubernetes 集群。

下面是 Kops 的特点:

  • 部署具有高可用性的 Kubernetes 主节点
  • 支持滚动集群更新
  • 自动化 AWS 和 GCE Kubernetes 集群的规划
  • 管理集群附加组件
  • 命令行中的命令自动补全
  • 生成 CloudFormation and Terraform 配置
  • 支持用于干运行和自动幂等性的状态同步模型
  • 创建实例组以支持异构集群

安装 Kops

以下是在 Linux 环境中安装 Kops 的简单步骤。我使用的是 Ubuntu 20.x。

首先,从发布包中下载 Kops。下面的命令下载最新的 Kops 包。

yaoweibin@ip-170-11-26-119:~$ curl -Lo kops https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64

Saving to: ‘kops-linux-amd64’
100%[=========================================================================================================================================================================>] 81,964,000  8.37MB/s   in 7.1s   
2021-06-10 16:23:19 (7.84 MB/s) - ‘kops-linux-amd64’ saved [81964000/81964000]

您需要为下载的 kops 文件提供可执行权限,并将其移动到 /usr/local/bin/ 目录。

yaoweibin@ip-170-11-26-119:~$ sudo chmod +x kops-linux-amd64
yaoweibin@ip-170-11-26-119:~$ sudo mv kops-linux-amd64 /usr/local/bin/kops

安装完成。现在您可以运行 kops 命令来验证安装。

yaoweibin@ip-170-11-26-119:〜$ kops
kops是Kubernetes ops。
kops是最简单的方法来快速创建和运行一个生产级别的Kubernetes集群。我们认为它就是用于集群的kubectl。

kops帮助您从命令行创建、销毁、升级和维护生产级别、高可用性的Kubernetes集群。目前官方支持AWS(Amazon Web Services),alpha版本支持GCE和VMware vSphere。

用法:
kops [command]

可用命令:
completion 输出给定shell(bash或zsh)的shell补全代码。
create 通过命令行、文件名或stdin创建资源。
delete 删除集群、实例组或密钥。
describe 描述资源。
edit 编辑集群和其他资源。
export 导出配置。
get 获取一个或多个资源。
import 导入集群。
replace 替换集群资源。
rolling-update 滚动更新集群。
toolbox 杂项不常用命令。
update 更新集群。
upgrade 升级Kubernetes集群。
validate 验证kops集群。
version 打印kops版本信息。

标志:
–alsologtostderr 同时将日志记录到标准错误和文件中
–config string 配置文件(默认为$HOME/.kops.yaml)
-h, –help 获取kops的帮助
–log_backtrace_at traceLocation 当日志命中line file:N时,发出堆栈跟踪(默认:0)
–log_dir string 如果非空,则在此目录中写入日志文件
–logtostderr 将日志记录到标准错误而不是文件中(默认为false)
–name string 集群名称
–state string 状态存储位置
–stderrthreshold severity 日志等级大于或等于此阈值将被发送到标准错误(默认值为2)
-v, –v Level 记录V日志的日志级别
–vmodule moduleSpec 逗号分隔的pattern=N设置列表,用于文件过滤日志记录

有关命令的更多信息,请使用“kops [command] –help”查看。

语法: kops validate cluster –wait

此命令将等待并验证指定时间的集群。因此,如果您想要验证五分钟的集群,请使用指定时间为5m运行该命令。

这就是关于Kops基础知识的全部内容,现在让我向您展示如何使用Kops在AWS上创建Kubernetes集群。

使用Kops在AWS上设置Kubernetes

在开始下面的步骤之前,这是一些先决条件:

安装kubectl

首先,我将安装kubectl。

Kubectl用于在Kubernetes集群上运行命令行命令。下载kubectl包。

yaoweibin@ip-170-11-26-119:~$  curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39.6M  100 39.6M    0     0  6988k      0  0:00:07  0:00:07 --:--:-- 6988k

您需要为下载的文件提供可执行权限,并将其移动到/usr/local/bin/目录。

yaoweibin@ip-170-11-26-119:~$ chmod +x ./kubectl
yaoweibin@ip-170-11-26-119:~$ sudo mv ./kubectl /usr/local/bin/kubectl

创建S3 Bucket

一旦您在Linux机器上安装并配置了AWS CLI,您就可以运行aws命令。我在我的Ubuntu系统上安装了aws cli,所以让我运行一个简单的命令,它将列出S3中的所有bucket。

yaoweibin@ip-170-11-26-119:~$ aws s3 ls

它将为空,因为我目前没有任何s3存储桶。让我检查一下是否有正在运行的ec2实例。

yaoweibin@ip-170-11-26-119:~$ aws ec2 describe-instances
{
    "Reservations": []
}

这意味着目前没有正在运行的ec2实例。

现在,您需要创建一个s3存储桶,Kops将在其中保存所有集群的状态信息。在这里,我正在使用us-west-2地区创建一个名为geekkops-bucket-1132的s3存储桶。您可以使用LocationConstraint来避免与地区相关的任何错误。

yaoweibin@ip-170-11-26-119:~$ aws s3api create-bucket --bucket geekkops-bucket-1132 --region us-west-2 --create-bucket-configuration LocationConstraint=us-west-2
{
    "Location": "http://geekkops-bucket-1132.s3.amazonaws.com/"
}

如果再次列出aws s3 bucket,将会得到刚刚创建的存储桶。

yaoweibin@ip-170-11-26-119:~$ aws s3 ls
2021-06-10 16:30:13 geekkops-bucket-1132

运行以下命令为s3存储桶启用版本。

yaoweibin@ip-170-11-26-119:~$ aws s3api put-bucket-versioning --bucket geekkops-bucket-1132 --versioning-configuration Status=Enabled

生成密钥

为将被Kops用于集群登录和密码生成的ssh密钥生成。

yaoweibin@ip-170-11-26-119:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:fH4JCBXMNRqzk1hmoK+cXmwSFaeBsuGBA5IWMkNuvq0 yaoweibin@ip-170-11-26-119
The key's randomart image is:
+---[RSA 2048]----+
|O=. .++Xoo |
|B++ .. @o* . |
|.= =. = = |
|o o o o o |
| . . . S o |
| o. = o . . |
| . .= + . o |
| .. + . |
| E . |
+----[SHA256]-----+

导出环境变量

将集群名称和s3存储桶作为<link_8>公开。这仅适用于当前会话。我使用后缀“.k8s.local”,因为我没有使用任何预配置的DNS。

yaoweibin@ip-170-11-26-119:~$ export KOPS_CLUSTER_NAME=geekdemo1.k8s.local
yaoweibin@ip-170-11-26-119:~$ export KOPS_STATE_STORE=s3://geekkops-bucket-1132

创建集群

使用kops create命令创建集群。以下是我使用Kops在AWS上创建Kubernetes集群的参数:

  • --cloud告诉我使用的云提供商
  • --zones是集群实例部署的区域
  • --node-count是要在Kubernetes集群中部署的节点数
  • --node-size--master-size是我使用的ec2实例类型,我使用的是微型实例
  • --name是集群名称

yaoweibin@ip-170-11-26-119:~$ kops create cluster –cloud=aws –zones=eu-central-1a –node-count=1 –node-size=t2.micro –master-size=t2.micro –name=${KOPS_CLUSTER_NAME}
I0216 16:35:24.225238 4326 subnets.go:180] Assigned CIDR 172.20.32.0/19 to subnet eu-central-1a
I0216 16:35:24.068088 4326 create_cluster.go:717] Using SSH public key: /home/ubuntu/.ssh/id_rsa.pub
Previewing changes that will be made:

I0216 16:35:24.332590 4326 apply_cluster.go:465] Gossip DNS: skipping DNS validation
I0216 16:35:24.392712 4326 executor.go:111] Tasks: 0 done / 83 total; 42 can run
W0216 16:35:24.792113 4326 vfs_castore.go:604] CA private key was not found
I0216 16:35:24.938057 4326 executor.go:111] Tasks: 42 done / 83 total; 17 can run
I0216 16:35:25.436407 4326 executor.go:111] Tasks: 59 done / 83 total; 18 can run
I0216 16:35:25.822395 4326 executor.go:111] Tasks: 77 done / 83 total; 2 can run
I0216 16:35:25.823088 4326 executor.go:111] Tasks: 79 done / 83 total; 2 can run
I0216 16:35:26.406919 4326 executor.go:111] Tasks: 81 done / 83 total; 2 can run
I0216 16:35:27.842148 4326 executor.go:111] Tasks: 83 done / 83 total; 0 can run

LaunchTemplate/master-eu-central-1a.masters.geekdemo1.k8s.local
AssociatePublicIP true
HTTPPutResponseHopLimit 1
HTTPTokens optional
IAMInstanceProfile name:masters.geekdemo1.k8s.local id:masters.geekdemo1.k8s.local
ImageID 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20210119.1
InstanceType t2.micro
RootVolumeSize 64
RootVolumeType gp2
RootVolumeEncryption false
RootVolumeKmsKey
SSHKey name:kubernetes.geekdemo1.k8s.local-3e:19:92:ca:dd:64:d5:cf:ff:ed:3a:92:0f:40:d4:e8 id:kubernetes.geekdemo1.k8s.local-3e:19:92:ca:dd:64:d5:cf:ff:ed:3a:92:0f:40:d4:e8
SecurityGroups [name:masters.geekdemo1.k8s.local] SpotPrice
Tags {k8s.io/cluster-autoscaler/node-template/label/kubernetes.io/role: master, k8s.io/cluster-autoscaler/node-template/label/kops.k8s.io/instancegroup: master-eu-central-1a, k8s.io/role/master: 1, kops.k8s.io/instancegroup: master-eu-central-1a, Name: master-eu-central-1a.masters.geekdemo1.k8s.local, KubernetesCluster: geekdemo1.k8s.local, kubernetes.io/cluster/geekdemo1.k8s.local: owned, k8s.io/cluster-autoscaler/node-template/label/node-role.kubernetes.io/master: }

Subnet/eu-central-1a.geekdemo1.k8s.local
ShortName eu-central-1a
VPC name:geekdemo1.k8s.local
AvailabilityZone eu-central-1a
CIDR 172.20.32.0/19
Shared false
Tags {KubernetesCluster: geekdemo1.k8s.local, kubernetes.io/cluster/geekdemo1.k8s.local: owned, SubnetType: Public, kubernetes.io/role/elb: 1, Name: eu-central-1a.geekdemo1.k8s.local}

VPC/geekdemo1.k8s.local
CIDR 172.20.0.0/16
EnableDNSHostnames true
EnableDNSSupport true
Shared false
Tags {kubernetes.io/cluster/geekdemo1.k8s.local: owned, Name: geekdemo1.k8s.local, KubernetesCluster: geekdemo1.k8s.local}

VPCDHCPOptionsAssociation/geekdemo1.k8s.local
VPC name:geekdemo1.k8s.local
DHCPOptions name:geekdemo1.k8s.local

Must specify –yes to apply changes

Cluster configuration has been created.

Suggestions:
* list clusters with: kops get cluster
* edit this cluster with: kops edit cluster geekdemo1.k8s.local
* edit your node instance group: kops edit ig –name=geekdemo1.k8s.local nodes-eu-central-1a
* edit your master instance group: kops edit ig –name=geekdemo1.k8s.local master-eu-central-1a

Finally configure your cluster with: kops update cluster –name geekdemo1.k8s.local –yes –admin

运行kops get命令以查看集群是否已创建。

yaoweibin@ip-170-11-26-119:~$ kops get cluster
NAME                    CLOUD   ZONES
geekdemo1.k8s.local     aws     eu-central-1a

更新集群

要将指定的集群规范应用于集群,请运行kops update命令。

yaoweibin@ip-170-11-26-119:~$ kops update cluster --name geekdemo1.k8s.local --yes --admin
I0216 16:38:16.800767    4344 apply_cluster.go:465] Gossip DNS: skipping DNS validation
I0216 16:38:16.919282    4344 executor.go:111] Tasks: 0 done / 83 total; 42 can run
W0216 16:38:17.343336    4344 vfs_castore.go:604] CA private key was not found
I0216 16:38:18.421652    4344 keypair.go:195] Issuing new certificate: "etcd-clients-ca"
I0216 16:38:18.450699    4344 keypair.go:195] Issuing new certificate: "etcd-peers-ca-main"
I0216 16:38:19.470785    4344 keypair.go:195] Issuing new certificate: "etcd-manager-ca-main"
I0216 16:38:19.531852    4344 keypair.go:195] Issuing new certificate: "etcd-peers-ca-events"
I0216 16:38:19.551601    4344 keypair.go:195] Issuing new certificate: "apiserver-aggregator-ca"
I0216 16:38:19.571834    4344 keypair.go:195] Issuing new certificate: "etcd-manager-ca-events"
I0216 16:38:19.592090    4344 keypair.go:195] Issuing new certificate: "master"
W0216 16:38:19.652894    4344 vfs_castore.go:604] CA private key was not found
I0216 16:38:19.653013    4344 keypair.go:195] Issuing new certificate: "ca"
I0216 16:38:24.344075    4344 executor.go:111] Tasks: 42 done / 83 total; 17 can run
I0216 16:38:24.306125    4344 executor.go:111] Tasks: 59 done / 83 total; 18 can run
I0216 16:38:26.189798    4344 executor.go:111] Tasks: 77 done / 83 total; 2 can run
I0216 16:38:26.190464    4344 executor.go:111] Tasks: 79 done / 83 total; 2 can run
I0216 16:38:26.738600    4344 executor.go:111] Tasks: 81 done / 83 total; 2 can run
I0216 16:38:28.810100    4344 executor.go:111] Tasks: 83 done / 83 total; 0 can run
I0216 16:38:29.904257    4344 update_cluster.go:313] Exporting kubecfg for cluster
kops has set your kubectl context to geekdemo1.k8s.local

集群正在启动。几分钟后即可准备好。

建议:
*验证集群:kops validate cluster --wait 10m
*列出节点:kubectl get nodes --show-labels
*ssh到主节点:ssh -i ~/.ssh/id_rsa [email protected]
*ubuntu用户仅适用于Ubuntu。如果不使用Ubuntu,请根据您的操作系统使用适当的用户。
*有关安装附加组件的信息,请阅读:https://kops.sigs.k8s.io/operations/addons.

如果您立即检查Kubernetes节点是否正在运行,您将收到一个错误。您需要稍微耐心等待几分钟(5-10分钟),直到集群创建完成。

yaoweibin@ip-170-11-26-119:~$ kubectl get nodes
无法连接到服务器:拨号tcp:在127.0.0.53:53上查找api-geekdemo1-k8s-local-dason2-1001342368.eu-central-1.elb.amazonaws.com:没有这样的主机

验证集群

我正在运行验证命令5分钟,以检查集群是否启动并正常。在验证输出中,您将能够在节点启动时看到节点详细信息。

yaoweibin@ip-170-11-26-119:~$ kops validate cluster --wait 5m
正在验证集群geekdemo1.k8s.local
实例组
名称                    角色    机器类型       最小    最大    子网
master-eu-central-1a    Master  t2.micro        1       1       eu-central-1a
nodes-eu-central-1a     Node    t2.micro        1       1       eu-central-1a

列出节点和Pod

现在运行下面的命令,检查所有节点是否准备好并运行。您可以看到主节点和节点都处于准备状态。

yaoweibin@ip-170-11-26-119:~$ kubectl get nodes
NAME                                             STATUS   ROLES    AGE     VERSION
ip-173-19-35-156.eu-central-1.compute.internal   Ready    master   10m     v1.20.1
ip-172-36-23-149.eu-central-1.compute.internal   Ready    node     5m38s   v1.20.1

您可以检查 Kubernetes 集群中运行的所有 pod。

yaoweibin@ip-170-11-26-119:~$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                                                     READY   STATUS    RESTARTS   AGE
kube-system   dns-controller-8d8889c4b-xp9dl                                           1/1     Running   0          8m26s
kube-system   etcd-manager-events-ip-173-19-35-156.eu-central-1.compute.internal       1/1     Running   0          10m
kube-system   etcd-manager-main-ip-173-19-35-156.eu-central-1.compute.internal         1/1     Running   0          10m
kube-system   kops-controller-9skdk                                                    1/1     Running   3          6m51s
kube-system   kube-apiserver-ip-173-19-35-156.eu-central-1.compute.internal            2/2     Running   0          10m
kube-system   kube-controller-manager-ip-173-19-35-156.eu-central-1.compute.internal   1/1     Running   6          10m
kube-system   kube-dns-696cb84c7-g8nhb                                                 3/3     Running   0          4m27s
kube-system   kube-dns-autoscaler-55f8f75459-zlxbr                                     1/1     Running   0          7m18s
kube-system   kube-proxy-ip-173-19-35-156.eu-central-1.compute.internal                1/1     Running   0          10m
kube-system   kube-proxy-ip-172-36-23-149.eu-central-1.compute.internal                1/1     Running   0          7m2s
kube-system   kube-scheduler-ip-173-19-35-156.eu-central-1.compute.internal            1/1     Running   5          10m

删除集群

与创建 Kubernetes 集群一样,使用 Kops 删除 Kubernetes 集群也非常简单。此 kops delete 命令将删除集群的所有云资源和集群注册表本身。

yaoweibin@ip-170-11-26-119:~$ kops删除集群—name geekdemo1.k8s.local—yes
类型名称ID
autoscaling-config  master-eu-central-1a.masters.geekdemo1.k8s.local lt-0cc11aec1943204e4
autoscaling-config  nodes-eu-central-1a.geekdemo1.k8s.local lt-0da65d2eaf6de9f5c
autoscaling-group   master-eu-central-1a.masters.geekdemo1.k8s.local master-eu-central-1a.masters.geekdemo1.k8s.local
autoscaling-group   nodes-eu-central-1a.geekdemo1.k8s.local nodes-eu-central-1a.geekdemo1.k8s.local
dhcp-options        geekdemo1.k8s.local dopt-0403a0cbbfbc0c72b
iam-instance-profile    masters.geekdemo1.k8s.local masters.geekdemo1.k8s.local
iam-instance-profile    nodes.geekdemo1.k8s.local   nodes.geekdemo1.k8s.local
iam-role            masters.geekdemo1.k8s.local masters.geekdemo1.k8s.local
iam-role            nodes.geekdemo1.k8s.local   nodes.geekdemo1.k8s.local
instance            master-eu-central-1a.masters.geekdemo1.k8s.local    i-069c73f2c23eb502a
instance            nodes-eu-central-1a.geekdemo1.k8s.local  i-0401d6b0d4fc11e77
iam-instance-profile:nodes.geekdemo1.k8s.local ok
load-balancer:api-geekdemo1-k8s-local-dason2 ok
iam-instance-profile:masters.geekdemo1.k8s.local ok
iam-role:masters.geekdemo1.k8s.local ok
instance:i-069c73f2c23eb502a ok
autoscaling-group:nodes-eu-central-1a.geekdemo1.k8s.local ok
iam-role:nodes.geekdemo1.k8s.local ok
instance:i-0401d6b0d4fc11e77 ok
autoscaling-config:lt-0cc11aec1943204e4 ok
autoscaling-config:lt-0da65d2eaf6de9f5c ok
autoscaling-group:master-eu-central-1a.masters.geekdemo1.k8s.local ok
keypair:key-0d82g920j421b89dn ok
已删除geekdemo1.k8s.local的kubectl配置

已删除集群:"geekdemo1.k8s.local"

结论

我希望本文对Kops有所帮助,今天您学到了新的东西。 Kops是一个在云上工作的绝佳工具。所以,请继续尝试本文中提到的步骤,并使用Kops在AWS上设置您的Kubernetes集群。

类似文章