在Catacoda上学习K8s基础(适合初学者)- 第一部分
学习使用Kubernetes(k8s)
在本页面上,我们将使用名为katacoda的“可以在浏览器上免费启动学习实例的Web服务”来进行Kubernetes入门的实践。有关详细内容,请参考上述链接,如果有任何疑问,请参考那里。
启动一个单节点集群
在这里,我们将学习如何启动包含DNS和Kube UI的单节点Minikube集群。
Minikube是一个可以在本地轻松运行Kubernetes的工具。它在笔记本电脑的虚拟机内运行单节点的Kubernetes集群。
如果您想快速了解在这个场景中要学习的内容,请查看概述。
总结
-
- ローカル環境でk8sのシングルクラスターを構築可能
-
- クラスタの構築には、minikube startを用いる
-
- k8sクラスタの管理には、kubectlを利用。kubectl cluster-infoコマンドでクラスタの情報を確認できる
-
- それぞれのリソースの情報を確認する際は、kubectl get で確認(には、pods,service,deployment,nodesが当てはまる)
-
- minikubeには、k8sマルチクラスタ同様アドオン機能が用意されている
アドオン機能の操作にはminikube addons <操作内容(list,enable dashboard 等)>で利用
启动Minikube
在本环境中,Minikube已经被下载并完成了初始设置。按照下面的命令,首先通过minikube version确认已下载的minikube信息,然后使用minikube start来部署单一集群。minikube start使用了选项–wait,并指定了要验证的元素,包括”apiserver,system_pods,default_sa,apps_running,node_ready,kubelet”,该选项能决定在启动集群之前是否完成指定要素的验证。默认情况下,将进行”apiserver,system_pods”的验证。
$ pwd
/root
$ minikube version
minikube version: v1.8.1
commit: cbda04cf6bbe65e987ae52bb393c10099ab62014
$ tree .minikube/
.minikube/
├── addons
├── apiserver.crt
├── apiserver.key
├── cache
│ ├── iso
│ ├── linux
│ │ └── v1.17.3
│ │ ├── kubeadm
│ │ ├── kubectl
│ │ └── kubelet
│ └── preloaded-tarball
│ ├── preloaded-images-k8s-v1-v1.17.3-docker-overlay2.tar.lz4
│ └── preloaded-images-k8s-v1-v1.17.3-docker-overlay2.tar.lz4.checksum
├── ca.crt
├── ca.key
├── certs
│ ├── ca-key.pem
│ ├── ca.pem
│ ├── cert.pem
│ └── key.pem
├── client.crt
├── client.key
├── config
│ └── config.json
├── files
├── logs
├── machines
├── profiles
├── proxy-client-ca.crt
├── proxy-client-ca.key
├── proxy-client.crt
└── proxy-client.key
12 directories, 20 files
$ ls -a
. .. .bashrc .cache .config Desktop .docker .gnupg .hushlogin .minikube .profile .ssh .vnc .vscode
$ minikube start --wait=false
* minikube v1.8.1 on Ubuntu 18.04
* Using the none driver based on user configuration
* Running on localhost (CPUs=2, Memory=2460MB, Disk=145651MB) ...
* OS release is Ubuntu 18.04.4 LTS
* Preparing Kubernetes v1.17.3 on Docker 19.03.6 ...
- kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Launching Kubernetes ...
* Enabling addons: default-storageclass, storage-provisioner
* Configuring local host environment ...
* Done! kubectl is now configured to use "minikube"
$
确认Cluster信息
使用kubectl CLI来管理k8s集群。
检查部署好的k8s集群的详细信息和状态,并确认节点的状态如下所示。
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.21:8443
KubeDNS is running at https://172.17.0.21:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 11m v1.17.3
容器的部署
在这里,在正在运行的集群中执行容器。
在容器启动时,使用deployment资源代替pod。
与pod不同,deployment可以管理版本控制和副本数。请参考此处以了解更多。
当前状态如下所示。
$ kubectl get deployment
No resources found in default namespace.
$ kubectl get pods
No resources found in default namespace.
$ docker image ls | grep docker-http-server
从上述命令可以发现,图像不存在于本地注册表中。
$ kubectl create deployment first-deployment --image=katacoda/docker-http-server
deployment.apps/first-deployment created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
first-deployment-666c48b44-szjwz 1/1 Running 0 6s
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
first-deployment 1/1 1 1 17s
$ docker images ls | grep docker-http-server
$ docker image ls | grep docker-http-server
katacoda/docker-http-server latest 0d6ee549ae13 4 years ago 7.59MB
通过创建部署对象,可以启动Pod并确认镜像已经在其内部下载完毕。
当容器被执行时,可以通过不同的网络选项来公开,以满足需求。一个可能的解决方案是为容器提供动态端口的 NodePort。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17m
$ kubectl expose deployment first-deployment --port=80 --type=NodePort
service/first-deployment exposed
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
first-deployment NodePort 10.97.89.102 <none> 80:32550/TCP 9s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17m
通过此链接可以确认容器的连接状态
$ export PORT=$(kubectl get svc first-deployment -o go-template='{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}')
$ echo "Accessing host01:$PORT"
Accessing host01:32550
$ curl host01:$PORT
<h1>This request was processed by host: first-deployment-666c48b44-szjwz</h1>
仪表盘的使用
在minikube上添加dashboard功能以便使用仪表盘。
$ minikube addons list
|-----------------------------|----------|--------------|
| ADDON NAME | PROFILE | STATUS |
|-----------------------------|----------|--------------|
| dashboard | minikube | disabled |
| default-storageclass | minikube | enabled ✅ |
| efk | minikube | disabled |
| freshpod | minikube | disabled |
| gvisor | minikube | disabled || helm-tiller | minikube | disabled |
| ingress | minikube | disabled |
| ingress-dns | minikube | disabled |
| istio | minikube | disabled || istio-provisioner | minikube | disabled |
| logviewer | minikube | disabled |
| metrics-server | minikube | disabled |
| nvidia-driver-installer | minikube | disabled || nvidia-gpu-device-plugin | minikube | disabled |
| registry | minikube | disabled |
| registry-creds | minikube | disabled |
| storage-provisioner | minikube | enabled ✅ || storage-provisioner-gluster | minikube | disabled |
|-----------------------------|----------|--------------|
$ minikube addons enable dashboard
* The 'dashboard' addon is enabled$ minikube addons list | grep dashboard
| dashboard | minikube | enabled ✅ |
请部署以下的YAML定义,以便可以在Kubernetes仪表板上使用。这仅需要在Katacoda上使用。
apiVersion: v1
kind: Namespace
metadata:
labels:
addonmanager.kubernetes.io/mode: Reconcile
kubernetes.io/minikube-addons: dashboard
name: kubernetes-dashboard
selfLink: /api/v1/namespaces/kubernetes-dashboard
spec:
finalizers:
- kubernetes
status:
phase: Active
---
apiVersion: v1
kind: Service
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard-katacoda
namespace: kubernetes-dashboard
spec:
ports:
- port: 80
protocol: TCP
targetPort: 9090
nodePort: 30000
selector:
k8s-app: kubernetes-dashboard
type: NodePort
在 Kubernetes 控制台上,可以通过用户界面展示应用程序。在本次部署中,可以通过30000端口访问控制台。
为了启动仪表板并进行确认,请执行以下命令。
$ kubectl apply -f /opt/kubernetes-dashboard.yaml
namespace/kubernetes-dashboard configured
service/kubernetes-dashboard-katacoda created
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
first-deployment NodePort 10.97.89.102 <none> 80:32550/TCP 35m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 52m
$ kubectl get pods -n kubernetes-dashboard -w
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-7b64584c5c-6sfk7 1/1 Running 0 6m30s
kubernetes-dashboard-79d9cd965-pf4mv 1/1 Running 0 6m29s