1 Kubernetes简介

1.1 what && where && why?

1.1.1 what?

首先我们来回答第一个问题,什么是Kubernets?

答曰:它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”,处于方便我们一般称它为k8sk8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。

1.1.2 where?

第二个问题,什么情况下我们需要用到k8s

答曰:当你的应用需要跑在很多机器上,每次增加机器、软件更新、版本回滚都会变得非常麻烦。这时候就需要k8s来管理这种百万千万台机器集群而不是每台机器单独手动配置。Kubernetes 可以为你提供集中式的管理集群机器和应用,加机器、版本升级、版本回滚,那都是一个命令就搞定的事,不停机的灰度更新,确保高可用、高性能、高扩展。

1.1.3 why?

最后灵魂疑问,为什么选择k8s呢?

在超大集群的背景下,k8s具有以下非常动人的特性:

  • 高可用,不宕机,自动灾难恢复
  • 灰度更新,不影响业务正常运转
  • 一键回滚到历史版本
  • 方便的伸缩扩展(应用伸缩,机器加减)、提供负载均衡
  • 有一个完善的生态

1.2 k8s重要概念

1.2.1 k8s集群架构

k8s集群架构

k8s由主节点(master)和工作结点(worker)组成.

master node:

主节点,控制平台,不需要很高性能,不跑任务,通常一个就行了,也可以开多个主节点来提高集群可用度

worker node:

工作节点,可以是虚拟机或物理计算机,任务都在这里跑,机器性能需要好点;通常都有很多个,可以不断加机器扩大集群;每个工作节点由主节点管理

基础包含关系:

首先我们先来学习一下几个概念:

Node:Node是Pod真正运行的主机,可以物理机,也可以是虚拟机。为了管理Pod,每个Node节点上至少要运行container runtime(比如docker或者rkt)、kubelet和kube-proxy服务。

Pod:在k8s中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建,计划的最小单元.一个 Pod 可以包含一个或多个容器,每个 Pod 有自己的虚拟IP。一个工作节点可以有多个 pod,主节点会考量负载自动调度 pod 到哪个节点运行。

Pod 的context可以理解成多个linux命名空间的联合:

  • PID 命名空间(同一个Pod中应用可以看到其它进程)
  • 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限)
  • IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信)
  • UTS 命名空间(同一个Pod中的应用共享一个主机名称)

Node和Pod的关系:每个Node都包括以下状态信息

  • 地址:包括hostname、外网IP和内网IP

  • 条件(Condition):包括OutOfDisk、Ready、MemoryPressure和DiskPressure

  • 容量(Capacity):Node上的可用资源,包括CPU、内存和Pod总数

  • 基本信息(Info):包括内核版本、容器引擎版本、OS类型等

    如果node 被删除,所拥有的Pod会自动分流到其他的Node,但是存在特殊的无法被分流的Pod

Pod和Node和容器关系

1.2.2 k8s组件

kube-apiserver API 服务器,公开了 Kubernetes API
etcd 键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库
kube-scheduler 调度 Pod 到哪个节点运行
kube-controller 集群控制器
cloud-controller 与云服务商交互

k8s组件

基于Azure的K8s创建与连接

在进行下面操作之前首先你得注册Azure并获取订阅(可能需要抽点血,慎重哈🤣)

2.1 命令行操作

首先进入官网,打开命令行bash,输入下面的两行命令

1
2
location=eastus #声明地点是us东部
az group create --name K8s_test1 --location $location # 创建一个名为K8s_test的资源组,地点为第一行输入的额参数

创建完成后会输出资源组配置信息如下:

1
2
3
4
5
6
7
8
9
10
11
{
"id": "/subscriptions/237369a6-9556-4d27-85cc-bf13e95e8244/resourceGroups/K8s_test1",
"location": "eastus",
"managedBy": null,
"name": "K8s_test1",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}

在接着我们需要在这个新建的资源组K8s_test1下创建k8s的一个集群,所以需要输入以下命令:

1
az aks create --resource-group K8s_test1 --name K8sCluster1 --node-count 1 --generate-ssh-keys --node-vm-size=Standard_B2s --disable-rbac

其中--resource-group后面的参数就是你想将集群放置的资源组的名称,也就是第一步创建的资源组名称,我这里是K8s_test1,而--name后的参数则是你想创建的这个集群的名字,这里我叫K8sCluster1--node-count顾名思义就是集群中worker node的个数(至于master node是托管给Azure管的),--node-vm-size是worker node的参数,这里我们选择了最便宜的主机

创建过程看你配置,如果你很老实按上面的操作,这边的话应该5-7min就可以。

不出意外的话,控制台会输出你的ssh-keys生成地址目录和集群的相应信息大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
SSH key files '/home/[用户名]/.ssh/id_rsa' and '/home/[用户名]/.ssh/id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage like Azure Cloud Shell without an attached file share, back up your keys to a safe location
{
"aadProfile": null,
"addonProfiles": null,
"agentPoolProfiles": [
{
"availabilityZones": null,
"count": 1,
"creationData": null,
"currentOrchestratorVersion": "1.23.12",
"enableAutoScaling": false,
"enableEncryptionAtHost": false,
"enableFips": false,
"enableNodePublicIp": false,
"enableUltraSsd": false,
"gpuInstanceProfile": null,
"hostGroupId": null,
"kubeletConfig": null,
"kubeletDiskType": "OS",
"linuxOsConfig": null,
"maxCount": null,
"maxPods": 110,
"minCount": null,
"mode": "System",
"name": "nodepool1",
"nodeImageVersion": "AKSUbuntu-1804gen2containerd-2022.11.02",
"nodeLabels": null,
"nodePublicIpPrefixId": null,
"nodeTaints": null,
"orchestratorVersion": "1.23.12",
"osDiskSizeGb": 128,
"osDiskType": "Managed",
"osSku": "Ubuntu",
"osType": "Linux",
"podSubnetId": null,
"powerState": {
"code": "Running"
},
"provisioningState": "Succeeded",
"proximityPlacementGroupId": null,
"scaleDownMode": null,
"scaleSetEvictionPolicy": null,
"scaleSetPriority": null,
"spotMaxPrice": null,
"tags": null,
"type": "VirtualMachineScaleSets",
"upgradeSettings": {
"maxSurge": null
},
"vmSize": "Standard_B2s",
"vnetSubnetId": null,
"workloadRuntime": null
}
],
"apiServerAccessProfile": null,
"autoScalerProfile": null,
"autoUpgradeProfile": null,
"azurePortalFqdn": "k8scluster-k8stest1-237369-2a186e18.portal.hcp.eastus.azmk8s.io",
"currentKubernetesVersion": "1.23.12",
"disableLocalAccounts": false,
"diskEncryptionSetId": null,
"dnsPrefix": "K8sCluster-K8stest1-237369",
"enablePodSecurityPolicy": null,
"enableRbac": false,
"extendedLocation": null,
"fqdn": "k8scluster-k8stest1-237369-2a186e18.hcp.eastus.azmk8s.io",
"fqdnSubdomain": null,
"httpProxyConfig": null,
"id": "",
"identity": {
"principalId": "56867ce4-6c0d-4952-8c3e-538a58895b32",
"tenantId": "",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"identityProfile": {
"kubeletidentity": {
"clientId": "",
"objectId": "",
"resourceId": ""
}
},
"kubernetesVersion": "1.23.12",
"linuxProfile": {
"adminUsername": "azureuser",
"ssh": {
"publicKeys": [
{
"keyData": ""
}
]
}
},
"location": "eastus",
"maxAgentPools": 100,
"name": "K8sCluster1",
"networkProfile": {
"dnsServiceIp": "",
"dockerBridgeCidr": "",
"ipFamilies": [
"IPv4"
],
"loadBalancerProfile": {
"allocatedOutboundPorts": null,
"effectiveOutboundIPs": [
{
"id": "",
"resourceGroup": ""
}
],
"enableMultipleStandardLoadBalancers": null,
"idleTimeoutInMinutes": null,
"managedOutboundIPs": {
"count": 1,
"countIpv6": null
},
"outboundIPs": null,
"outboundIpPrefixes": null
},
"loadBalancerSku": "Standard",
"natGatewayProfile": null,
"networkMode": null,
"networkPlugin": "kubenet",
"networkPolicy": null,
"outboundType": "loadBalancer",
"podCidr": "10.244.0.0/16",
"podCidrs": [
"10.244.0.0/16"
],
"serviceCidr": "10.0.0.0/16",
"serviceCidrs": [
"10.0.0.0/16"
]
},
"nodeResourceGroup": "MC_K8s_test1_K8sCluster1_eastus",
"oidcIssuerProfile": {
"enabled": false,
"issuerUrl": null
},
"podIdentityProfile": null,
"powerState": {
"code": "Running"
},
"privateFqdn": null,
"privateLinkResources": null,
"provisioningState": "Succeeded",
"publicNetworkAccess": null,
"resourceGroup": "K8s_test1",
"securityProfile": {
"azureKeyVaultKms": null,
"defender": null
},
"servicePrincipalProfile": {
"clientId": "msi",
"secret": null
},
"sku": {
"name": "Basic",
"tier": "Free"
},
"storageProfile": {
"blobCsiDriver": null,
"diskCsiDriver": {
"enabled": true
},
"fileCsiDriver": {
"enabled": true
},
"snapshotController": {
"enabled": true
}
},
"systemData": null,
"tags": null,
"type": "Microsoft.ContainerService/ManagedClusters",
"windowsProfile": null
}

下一步我们需要连接我们刚刚用命令行创建的K8s的这个集群,需要在命令行输入:

1
az aks get-credentials --resource-group=K8s_test1 --name=K8sCluster1

接着输入

1
kubectl get nodes

就可以看到自己部署的worker nodes的信息

2.2 UI界面操作

等待更新

参考资料

1、视频资源:

2、文档资料