K8s 学习和集群部署

Kubernetes,也被称作K8s(因为K和s中间刚好有8个字母)

Minikube部署

Minikube是K8s单机部署的一种方式,能够在Windows主机上直接单机部署。K8s的官方教程也是以一个在线的Minikube作为例子进行讲解。

作为新手,想要进行MiniKube部署需要先确保在本地安装了kubectl。kubectl的安装也非常简单,只需要在官方网站直接下载kubectl.exe,放到本机的文件夹中并将文件夹路径添加到系统环境变量Path。配置好kubectl之后,可以在命令行中敲入kubectl version,查看kubectl的版本号,但需要在MiniKube启动的情况才能不报其他错误,如问题 1.

安装Minikube也很简单,只需要在官方网站直接下载安装包minikube-installer.exe,安装前需要确保Windows主机的Hyper-V是启动的,如果本机无法安装Hyper-V,那就和我一样安装VirtualBox,这两者都安装好了之后,打开命令行,输入以下的启动命令,Minikube就启动了。

Minikube 启动命令:minikube start --registry-mirror=https://registry.docker-cn.com --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

要让中国人疯狂吐槽的是,Minikube默认访问外网,而且默认拉取外网镜像,也许你会对这一串这么长的启动命令感到困惑,但这一串启动命令确实不可缺少。这里其实只需要查看 minikube start --help就可以看到

PS C:\Users\Richard> minikube start --help
启动本地 kubernetes 集群Options:--addons=[]: Enable addons. see `minikube addons list` for a list of valid addon names.--apiserver-ips=[]: 一组在为 kubernetes 生成的证书中使用的 apiserver IP
地址。如果您希望将此 apiserver 设置为可从机器外部访问,则可以使用这组 apiserver IP 地址--apiserver-name='minikubeCA': The apiserver name which is used in the generated certificate for kubernetes.  This
can be used if you want to make the apiserver available from outside the machine--apiserver-names=[]: 一组在为 kubernetes 生成的证书中使用的 apiserver 名称。如果您希望将此
apiserver 设置为可从机器外部访问,则可以使用这组 apiserver 名称--apiserver-port=8443: apiserver 侦听端口--auto-update-drivers=true: If set, automatically updates drivers to the latest version. Defaults to true.--cache-images=true: 如果为 true,请缓存当前引导程序的 docker
映像并将其加载到机器中。在 --vm-driver=none 情况下始终为 false。--container-runtime='docker': The container runtime to be used (docker, crio, containerd).--cpus=2: Number of CPUs allocated to the minikube VM.--cri-socket='': The cri socket path to be used.--disable-driver-mounts=false: 停用由管理程序提供的文件系统装载--disk-size='20000mb': 分配给 minikube 虚拟机的磁盘大小(格式:<数字>[<单位>],其中单位 =
b、k、m 或 g)。--dns-domain='cluster.local': kubernetes 集群中使用的集群 dns 域名--dns-proxy=false: 为 NAT DNS 请求启用代理(仅限 virtualbox 驱动程序)--docker-env=[]: 传递给 Docker 守护进程的环境变量。(格式:键值对)--docker-opt=[]: 指定要传递给 Docker 守护进程的任意标志。(格式:key=value)--download-only=false: 如果为 true,仅会下载和缓存文件以备后用 -
不会安装或启动任何项。--embed-certs=false: if true, will embed the certs in kubeconfig.--enable-default-cni=false: Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with
"--network-plugin=cni".--extra-config=: A set of key=value pairs that describe configuration that may be passed to different components.The key should be '.' separated, and the first part before the dot is the component to apply the configuration to.Valid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, schedulerValid kubeadm parameters: ignore-preflight-errors, dry-run, kubeconfig, kubeconfig-dir, node-name, cri-socket,
experimental-upload-certs, certificate-key, rootfs, pod-network-cidr--feature-gates='': 一组用于描述 alpha 版功能/实验性功能的功能限制的键值对。--force=false: 强制 minikube 执行可能有风险的操作--host-dns-resolver=true: 为 NAT DNS 请求启用主机解析器(仅限 virtualbox 驱动程序)--host-only-cidr='192.168.99.1/24': 需要用于 minikube 虚拟机的 CIDR(仅限 virtualbox 驱动程序)--hyperkit-vpnkit-sock='': 用于网络连接的 VPNKit 套接字的位置。如果为空,则停用 Hyperkit
VPNKitSock;如果为“auto”,则将 Docker 用于 Mac VPNKit 连接;否则使用指定的 VSock(仅限
hyperkit 驱动程序)--hyperkit-vsock-ports=[]: 应在主机上公开为套接字的访客 VSock 端口列表(仅限 hyperkit
驱动程序)--hyperv-virtual-switch='': hyperv 虚拟交换机名称。默认为找到的第一个 hyperv
虚拟交换机。(仅限 hyperv 驱动程序)--image-mirror-country='':
需要使用的映像镜像的国家/地区代码。留空以使用全球代码。对于中国大陆用户,请将其设置为
cn。--image-repository='': Alternative image repository to pull docker images from. This can be used when you have
limited access to gcr.io. Set it to "auto" to let minikube decide one for you. For Chinese mainland users, you may use
local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers--insecure-registry=[]: Insecure Docker registries to pass to the Docker daemon.  The default service CIDR range
will automatically be added.--interactive=true: 允许用户提示以获取更多信息--iso-url='https://storage.googleapis.com/minikube/iso/minikube-v1.5.1.iso': Location of the minikube iso.--keep-context=false: 这将保留现有 kubectl 上下文并创建 minikube 上下文。--kubernetes-version='v1.16.2': minikube 虚拟机将使用的 kubernetes 版本(例如 v1.2.3)--kvm-gpu=false: 在 minikube 中启用实验性 NVIDIA GPU 支持--kvm-hidden=false: 向 minikube 中的访客隐藏管理程序签名(仅限 kvm2 驱动程序)--kvm-network='default': KVM 网络名称。(仅限 kvm2 驱动程序)--kvm-qemu-uri='qemu:///system': KVM QEMU 连接 URI。(仅限 kvm2 驱动程序)--memory='2000mb': 为 minikube 虚拟机分配的 RAM 容量(格式:<数字>[<单位>],其中单位 =
b、k、m 或 g)。--mount=false: This will start the mount daemon and automatically mount files into minikube.--mount-string='C:\Users\Richard:/minikube-host': The argument to pass the minikube mount command on start.--native-ssh=true: Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh'
command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for
SSH'.--network-plugin='': The name of the network plugin.--nfs-share=[]: 通过 NFS 装载与访客共享的本地文件夹(仅限 hyperkit 驱动程序)--nfs-shares-root='/nfsshares': NFS 共享的根目录位置,默认为 /nfsshares(仅限 hyperkit
驱动程序)--no-vtx-check=false: 禁用在启动虚拟机之前检查硬件虚拟化的可用性(仅限 virtualbox
驱动程序)--registry-mirror=[]: 传递给 Docker 守护进程的注册表镜像--service-cluster-ip-range='10.96.0.0/12': 需要用于服务集群 IP 的 CIDR。--uuid='': 提供虚拟机 UUID 以恢复 MAC 地址(仅限 hyperkit 驱动程序)--vm-driver='': Driver is one of: [virtualbox vmwarefusion hyperv vmware] (defaults to auto-detect)--wait=false: Wait until Kubernetes core services are healthy before exiting.--wait-timeout=6m0s: max time to wait per Kubernetes core services to be healthy.Usage:minikube start [flags] [options]Use "minikube start options" for a list of global command-line options (applies to all commands).

官方对这个方式也是无能为力,而且也建议配置阿里云的镜像地址。

用Minikube 创建一个本地集群

Kubenetes 是 一个开源平台,可满足生产环境的需要。

Kubernetes 用于协调高度可用的计算机集群,这些计算机群集被连接作为单个单元工作。

Kubernetes 的抽象性允许您将容器化的应用程序部署到集群,而不必专门将其绑定到单个计算机。为了利用这种新的部署模型,应用程序需要以将它们与各个主机分离的方式打包: 它们需要被容器化。容器化应用程序比过去的部署模型更灵活和可用,其中应用程序直接安装到特定机器上,作为深入集成到主机中的软件包。

Kubernetes 在一个集群上以更有效的方式自动分发和调度容器应用程序。

(摘自官方教程)

简单来说,K8s是一个平台,平台之上是容器化的应用程序。K8s负责协调这些容器化的程序,包括自动分发和自发调度等方式来使计算机集群保持高度可用,而这些计算机集群对于K8s有相当于一个个单元,互相之间被K8s连接起来,形成一个大的环境。

Kubernetes 集群由两种类型的资源组成:Master(调度节点),Nodes(应用程序实际运行的工作节点)

Master 协调集群中的所有活动,例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。

Nodes 是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。每个工作节点都有一个 Kubelet,它是管理 节点 并与 Kubernetes Master 节点进行通信的代理。节点上还应具有处理容器操作的工作,例如 Docker 或 rkt。一个 Kubernetes 工作集群至少有三个节点。

当您在 Kubernetes 上部署应用程序时,您可以告诉 master 启动应用程序容器。Master 调度容器在集群的 节点 上运行。

节点 使用 Master 公开的 Kubernetes API 与 Master 通信。最终用户还可以直接使用 Kubernetes 的 API 与集群交互。

简单来说,Master协调集群中的所有活动,Nodes处理容器操作,每一个Node都有一个Kubelet作为其代理,与Master节点进行通信并对Node进行管理。节点之间的通信是通过公开的Kubernetes API进行通信,这个API不仅节点可以使用,用户也可以使用来达到交互目的。

Minikube启动集群之后,我们可以利用命令行,

  • kubectl cluster-info
  • kubectl get nodes

对集群信息进行查看,可以看到Minikube创建的集群拥有一个Master节点,和一个Node节点。

PS C:\Users\Richard> kubectl cluster-info
Kubernetes master is running at https://192.168.99.101:8443
KubeDNS is running at https://192.168.99.101:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
PS C:\Users\Richard> kubectl get nodes
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   13h   v1.16.2

使用kubectl创建部署

一旦运行了 Kubernetes 集群,您可以在其上部署容器化应用程序。为此,您可以创建一个 Kubernetes Deployment。Deployment 负责创建和更新应用程序实例。创建 Deployment 后, Kubernetes master 会将 Deployment 创建的应用程序实例调度到集群中的各个节点。

创建应用程序实例后,Kubernetes 部署控制器会持续监视这些实例。如果托管它的节点不可用或删除,则部署控制器将替换实例。 这提供了一种解决机器故障或维护的自愈机制。

K8s集群上我们部署容器化应用程序,要创建一个Deployment来负责创建和更新应用程序实例。创建好Deployment后,Deployment会去创建应用程序实例,然后Master负责将实例调度到集群的各个节点,同时会有一个部署控制器持续监视这些实例。

在编排诞生前的世界中,通常会使用安装脚本启动应用程序,但是它们并不能从机器故障中恢复。通过创建应用程序实例并使其运行在跨节点的机器之间,Kubernetes 部署提供了截然不同的应用管理方法。

以前需要运维不断地去监控应用程序然后将其从机器故障中恢复,而现在部署控制器会持续监控这些应用程序实例,如果托管它的节点不可用或删除,则部署控制器将替换实例,这提供了一种自动化的解决机器故障或维护的机制(其实是程序代替了人),反过来看也像是集群拥有了自愈能力。

创建一个Deployment,直接通过kubectl命令行创建:

PS C:\Users\Richard> kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created
PS C:\Users\Richard> kubectl get deployments
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   0/1     1            0           14s

在创建一个部署的时候,K8s主要做了三件事:

  • 由于我们刚才创建的集群只拥有一个可用的(AVAILABEL)节点,不过只要部署的应用可用运行,K8s就会搜索一个合适的节点
  • 把这个容器化应用调度到那个合适的节点,并将其运行起来成为应用程序实例
  • 为重新调度这个应用程序实例在集群里面选择一个备选节点并保持这个配置

创建好部署之后,应用程序就已经作为一个实例跑在节点上了。这时不仅会有一个部署控制器来监控应用程序实例,K8s还会创建一个Pod来托管应用程序实例。

Pod 是一个 Kubernetes 的资源抽象,表示一个或多个应用容器 (例如 Docker 或 rkt) 组,以及一些用于这些容器的共享资源。这些资源包括:

  • 共享存储,如卷
  • 网络,作为唯一的集群 IP 地址
  • 每个容器如何运行的信息,例如容器镜像版本或要使用的特定端口

Pod 模型可以理解为应用程序特定的 “逻辑主机”,并且可以包含相对紧密耦合的不同应用程序容器。

Pod一般只运行在K8s内部,而且是处于一个私有局域网。默认情况下,同一个K8s集群中Pods之间和Services之间是能够进行通信的,当我们使用kubectl命令时,我们是通过一个API端口来和我们部署的应用进行通信。

而kubectl命令行也有命令可以创建一个代理(proxy),这个代理会打通集群间的私有网络,也能使我们本地可以访问到集群内部的私有网络。

PS C:\Users\Richard> kubectl proxy
Starting to serve on 127.0.0.1:8001

创建好代理之后,我们就可以访问这个端口,来获取K8s集群内部信息

PS C:\Users\Richard> curl http://localhost:8001/versionStatusCode        : 200
StatusDescription : OK
Content           : {"major": "1","minor": "16","gitVersion": "v1.16.2","gitCommit": "c97fe5036ef3df2967d086711e6c0c405941e14b","gitTreeState": "clean","buildDate": "2019-10-15T19:09:08Z","goVersion"...
RawContent        : HTTP/1.1 200 OKContent-Length: 264Cache-Control: no-cache, privateContent-Type: application/jsonDate: Tue, 12 Nov 2019 03:14:50 GMT{"major": "1","minor": "16","gitVersion": "v1.16...
Forms             : {}
Headers           : {[Content-Length, 264], [Cache-Control, no-cache, private], [Content-Type, application/json], [Date, Tue, 12 Nov 2019 03:14:50 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 264

然而,为了让新的Deployment可以不通过代理访问,我们需要利用K8s来创建一个服务Service。在创建服务之前,我们可以先查看一下Pod和节点,学习一下kubectl的运维方式。

查看Pod和节点

Pod 是 Kubernetes 平台上原子级别的单元。当我们在 Kubernetes 上创建一个部署时,该部署将在其中创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都绑定到它被调度的节点,并且始终在那里,直到终止 (根据重启策略) 或删除。在节点故障的情况下,在集群中的其他可用节点上调度相同的 Pod。

Pod 模型可以理解为应用程序特定的 “逻辑主机”,并且可以包含相对紧密耦合的不同应用程序容器。例如,Pod 可能包含带有 Node.js 应用程序的容器以及另一个要吸收 Node.js Web 服务器提供的数据的不同容器。Pod 中的容器共享 IP 地址和端口空间,始终位于同一位置并且统一调度,并在相同的节点上运行,共享上下文环境。

也就是说,当我们创建一个部署Deployment时,该部署中就会创建Pod,用来托管容器化应用,而当Pod绑定到它被调度的节点上时,容器化应用容器才启动成实例。Pod中共享IP地址和端口空间,使得其中的容器化程序一般都属于强耦合类型。而节点故障时,K8s在创建部署时就已经会配置一个备用节点来重新调度这些容器,也就是故障节点的Pod就会消亡,而这些容器化应用程序就会调度到其他可用节点下的Pod。所以,一个Pod总是绑定一个Node,并且始终在那里,直到终止 (根据重启策略) 或删除,这一点不会变。

Pod 总是运行在 Node上。Node 是 Kubernetes 的工作机器,可以是虚拟机或物理机,这取决于在集群的安装情况。每个节点由 Master 管理。一个节点上可以有多个 Pod, Kubernetes master 会自动处理调度集群各个节点上的 Pod。 Master 在自动调度时,会考虑每个 Node 上的可用资源。

每个 Kubernetes 节点至少运行以下组件:

  • Kubelet 是负责 Kubernetes Master 和 所有节点之间通信的进程,它管理机器上运行的 Pod 和容器。
  • 容器运行时(例如 Docker、rkt) 负责从镜像仓库中拉取容器镜像,解包容器并运行应用程序

每个节点上都具备kubelet,负责通信,管理机器上运行的Pod和容器。而Docker或rkt则负责从镜像仓库中拉取容器镜像,解包容器并运行应用程序。

命令行运维

要查看当前K8s集群的pod列表,并查看pod信息,可以使用命令kubectl get podskubectl describe pods

PS C:\Users\Richard> kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
k8s-bootcamp-fdb77ff6c-pq29q   1/1     Running   0          12m
k8s-redis-77c74b64f4-kh48f     1/1     Running   0          19m
PS C:\Users\Richard> kubectl describe pods
Name:         k8s-bootcamp-fdb77ff6c-pq29q
Namespace:    default
Priority:     0
Node:         minikube/192.168.99.101
Start Time:   Tue, 12 Nov 2019 20:01:45 +0800
Labels:       app=k8s-bootcamppod-template-hash=fdb77ff6c
Annotations:  <none>
Status:       Running
IP:           172.17.0.5
IPs:IP:           172.17.0.5
Controlled By:  ReplicaSet/k8s-bootcamp-fdb77ff6c
Containers:k8s-bootcamp:Container ID:   docker://de8473720109c6f691a76394fc1bf48e7520e97efbe6330770cc3f66f6dd9042Image:          hub.c.163.com/bingohuang/k8s-bootcamp:1.2Image ID:       docker-pullable://hub.c.163.com/bingohuang/k8s-bootcamp@sha256:045d01a76a720f701d43ad64915290ceb11e8930630ec56e479505b50a8638edPort:           <none>Host Port:      <none>State:          RunningStarted:      Tue, 12 Nov 2019 20:02:36 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-scm8n (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:default-token-scm8n:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-scm8nOptional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s
Events:Type    Reason     Age        From               Message----    ------     ----       ----               -------Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/k8s-bootcamp-fdb77ff6c-pq29q to minikubeNormal  Pulling    12m        kubelet, minikube  Pulling image "hub.c.163.com/bingohuang/k8s-bootcamp:1.2"Normal  Pulled     11m        kubelet, minikube  Successfully pulled image "hub.c.163.com/bingohuang/k8s-bootcamp:1.2"Normal  Created    11m        kubelet, minikube  Created container k8s-bootcampNormal  Started    11m        kubelet, minikube  Started container k8s-bootcampName:         k8s-redis-77c74b64f4-kh48f
Namespace:    default
Priority:     0
Node:         minikube/192.168.99.101
Start Time:   Tue, 12 Nov 2019 19:53:56 +0800
Labels:       app=k8s-redispod-template-hash=77c74b64f4
Annotations:  <none>
Status:       Running
IP:           172.17.0.4
IPs:IP:           172.17.0.4
Controlled By:  ReplicaSet/k8s-redis-77c74b64f4
Containers:redis:Container ID:   docker://8f2473ded4c2e034cfe5b6bc66b15901ce1a09f3c3ec42b61c8ccfc1f1c67dd8Image:          hub.c.163.com/library/redis:latestImage ID:       docker-pullable://hub.c.163.com/library/redis@sha256:373f1f476089724ae20e555a5709f876f319f1b08613020232064f38feb0ae3dPort:           <none>Host Port:      <none>State:          RunningStarted:      Tue, 12 Nov 2019 19:54:55 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-scm8n (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:default-token-scm8n:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-scm8nOptional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300snode.kubernetes.io/unreachable:NoExecute for 300s
Events:Type    Reason     Age        From               Message----    ------     ----       ----               -------Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/k8s-redis-77c74b64f4-kh48f to minikubeNormal  Pulling    19m        kubelet, minikube  Pulling image "hub.c.163.com/library/redis:latest"Normal  Pulled     19m        kubelet, minikube  Successfully pulled image "hub.c.163.com/library/redis:latest"Normal  Created    19m        kubelet, minikube  Created container redisNormal  Started    19m        kubelet, minikube  Started container redis

由于创建部署时,部署会相应创建Pod,而Pod托管了我们指定的镜像实例化的容器,如果我们由命令行强制删除了Pod,部署Deployment本来会查看配置中的备用节点然后再该备用节点上创建Pod,然后将容器调度过去实例化,而我们这边只有一个Node,所以如果我们删除了Pod,不删除Deployment,Pod会不断在Node上重新创建并重新构造容器,整个过程如下:

PS C:\Users\Richard> kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
k8s-bootcamp-fdb77ff6c-pq29q   1/1     Running   0          22m
k8s-redis-77c74b64f4-kh48f     1/1     Running   0          29m
PS C:\Users\Richard> kubectl delete pods k8s-redis-77c74b64f4-kh48f
pod "k8s-redis-77c74b64f4-kh48f" deleted
PS C:\Users\Richard> kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
k8s-bootcamp-fdb77ff6c-pq29q   1/1     Running   0          22m
k8s-redis-77c74b64f4-c5pj6     1/1     Running   0          22s
// 可以看到两次生成的Pod名称不同
PS C:\Users\Richard> kubectl get deployments
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
k8s-bootcamp   1/1     1            1           23m
k8s-redis      1/1     1            1           31m
PS C:\Users\Richard> kubectl delete deployments k8s-redis
deployment.apps "k8s-redis" deleted
PS C:\Users\Richard> kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
k8s-bootcamp-fdb77ff6c-pq29q   1/1     Running   0          24m
// 可以看到如果我们删除了Deployments,Pod就会对应被删除,不会再创建

如果一个Pod中只有一个容器,那么我们可以用kubectl exec命令,像Docker一样去启动容器的bash,这里可以省略掉,容器名称,命令如下

PS C:\Users\Richard> kubectl exec -it k8s-bootcamp-fdb77ff6c-pq29q bash
root@k8s-bootcamp-fdb77ff6c-pq29q:/usr/share/nginx/www# ls
1-0.html  1-3-1.html  2-0.html  2-3-1.html  3-0.html  3-3-1.html  4-0.html  4-3-1.html  404.html  5-2.html    5-3.html  6-1.html    6-3-2.html  LICENSE      index.html
1-1.html  1-3-2.html  2-1.html  2-3-2.html  3-1.html  3-3-2.html  4-1.html  4-3-2.html  5-0.html  5-3-1.html  50x.html  6-2.html    6-3.html    README.md    public
1-2.html  1-3.html    2-2.html  2-3.html    3-2.html  3-3.html    4-2.html  4-3.html    5-1.html  5-3-2.html  6-0.html  6-3-1.html  6-4.html    footer.html
root@k8s-bootcamp-fdb77ff6c-pq29q:/usr/share/nginx/www# exit
exit

最后,对于无法成功跑起来的Pod,可以执行kubectl logs $POD_NAME来查看Pod的日志。

Q&A

  1. kubectl version 时报错 Unable to connect to the server: dial tcp 192.168.99.100:8443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

Minikube没有启动时会报这个错误,解决方案就是先启动Minikube,只要Minikube是正常启动的一般都不会再报这个错误,查看Minikube启动状态可以用 minikube status

一个周六一台笔记本完成K8s的基础入门(写作中)相关推荐

  1. k8s零基础入门 (学习笔记)

    夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远. 夫学须静也,才须学也,非学无以广才,非志无以成学.淫慢则不能励精,险躁则不能冶性. 年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐, ...

  2. proteus如何添加stm32_一个应用软件程序员的单片机STM32零基础入门

    为什么开始考虑搞嵌入式开发? 近5年来,从云计算.大数据到机器学习.AI,各种新潮的技术概念一波--接一波. 作为一名好奇心旺盛的软件程序员,每一个技术概念流行起来都会去凑凑热闹. 但,在我的技术栈里 ...

  3. 两台笔记本如何不走路由而是通过无线网卡互联

    (2008-06-03 20:32 博客搬家拾遗) 前几天在宿舍,四个人想打DOAT,这四台本本里有两台有无线网卡,宿舍虽然有个4口路由器(不带无线),但还有一个人要上网.于是打算这么办: 于是在两台 ...

  4. 两台笔记本通过无线连接共享上网

    『电脑网络』 [网络天地]两台笔记本通过无线连接共享上网 点击:5551 回复:2 作者:一剑追风 发表日期:2008-11-25 21:25:00 两台笔记本通过无线连接共享上网 以前跟同事一起出差 ...

  5. android德州扑克计算器,学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum...

    原标题:学界 | 一台笔记本打败超算:CMU冷扑大师团队提出全新德扑AI Modicum 选自arXiv 参与:路.晓坤 CMU 冷扑大师团队在读博士 Noam Brown.Tuomas Sandho ...

  6. 来,我们谈谈怎么选购一台笔记本

    一.写在前面: 笔记本的更新换代之快是无法想象的,可能我今天刚推荐一款性价比第一的笔记本,明天就有更好更便宜的笔记本出现了.只推荐一款型号给各位只能是授之以鱼.但让人欣慰的是,总有一些不变的思路可以让 ...

  7. android 解锁mac,论一台笔记本三个不同系统的玩法,解锁正确姿势

    原标题:论一台笔记本三个不同系统的玩法,解锁正确姿势 关于<折腾永无止境>的文章... 所以不打算长篇幅介绍怎么安装.步骤.怎么折腾的教科书,不懂?隔壁度娘给你答案! 目标非常明确:要榨干 ...

  8. 两台笔记本 共享上网

    有时碰上两台笔记本需要互相拷贝资料或共享上网,在没有路由器的情况下,本来只有一台电脑可以通过宽带拨号上网,另一台就无法再通过拨号方式或网线互联两台笔记本,因为第一台电脑的网口已被占用. 这种情况下,我 ...

  9. 双台笔记本之间的屏幕扩展

    起因: 因疫情爆发,开学无望,破天荒地在家学习,但无奈笔记本只有一台屏幕,做什么都不方便,看到老哥退下来的笔记本,想着做一个扩展屏. 两台本子都有HDMI接口,遂登淘宝,9¥下单包邮一条HDMI数据传 ...

最新文章

  1. gatsby_将您的GraphCMS数据导入Gatsby
  2. C++——auto_ptr与unique_ptr
  3. matlab利用数据求公式,matlab新手,求帮助!主要是如何将数据和公式导入
  4. 算法-------求众数
  5. 基于PU-Learning的恶意URL检测
  6. python-3.x-基本数据类型
  7. 霸榜各大CV任务榜单,Swin Transformer横空出世!
  8. word文档被锁定无法编辑的解决方法
  9. 基于实数编码的参数自适应遗传算法(matlab代码)
  10. js 内存引用计数_快速内存管理–自动引用计数
  11. matlab中 晶闸管整流桥导通角_逆变角如何设置,matlab仿真模型作业
  12. Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值(个人解释)
  13. javaweb实现即时消息推送功能
  14. 服务器如何挂网页游戏,网页游戏怎么挂云服务器
  15. java和python哪个运行速度快_python和java学哪个比较简单点
  16. 简单的java文档扫描器
  17. Python - Flask 图片验证码和邮箱验证码的后端实现
  18. G1D38-Evaluation Metrics
  19. 建武28a对讲机最大距离_健伍TH-26A,TG-28A,TH-28A和TK208对讲机检修实例说明
  20. [图文教程]BIOS设置教程

热门文章

  1. docker 部署 joplin server进行文档同步
  2. Prowork 协同日历助你在家办公更高效
  3. Aspose.PDF企业案例:Canopy 使用 Aspose.PDF for .NET 设法匿名化 PDF 文件中的敏感信息
  4. 杰力科创RGB低频加湿器芯片——DLT8W10SD
  5. 数据仓库---企业信息工厂(EIF)
  6. 神奇数字7(你在知网搜不到的冷知识)
  7. android手机可以换字体吗,最新版安卓手机怎么换字体?
  8. Linux工作计时提醒软件,使用Ubuntu命令完成定时提醒功能(预防rsi)
  9. 2014年多项审计公告发布 央企高管买房不交全款
  10. 大数累加(高精度/C++)