https://www.digitalocean.com/community/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-centos-7

在这里插入图片描述
简介Kubernetes是一个容器编排系统,可以大规模管理容器。 Kubernetes最初由谷歌根据其在生产中运行容器的经验开发而成,是一个开源的,并由世界各地的社区积极开发。
注意:本教程使用的是Kubernetes 1.15版,这是本文发布时的官方支持版本。有关最新版本的最新信息,请参阅官方Kubernetes文档中的当前发行说明。
Kubeadm自动安装和配置Kubernetes组件,例如API服务器,Controller Manager和Kube DNS。但是,它不会创建用户或处理操作系统级依赖关系及其配置的安装。对于这些初步任务,可以使用Ansible或SaltStack等配置管理工具。使用这些工具可以更加简单地创建其他集群或重新创建现有集群,并且不易出错。
在本指南中,您将使用Ansible和Kubeadm从头开始设置Kubernetes集群,然后将容器化的Nginx应用程序部署到它。
目标您的群集将包括以下物理资源:
一个主节点主节点(Kubernetes中的节点指服务器)负责管理群集的状态。它运行Etcd,它在将工作负载调度到工作节点的组件之间存储集群数据。
3个工作节点工作节点是运行工作负载(即容器化应用程序和服务)的服务器。
一旦工作人员分配了工作负载,工作人员将继续运行您的工作负载,即使主计划在调度完成后停止工作也是如此。通过添加工作人员可以增加群集的容量。
完成本指南后,如果群集中的服务器具有足够的CPU和RAM资源供应用程序使用,您将拥有一个可以运行容器化应用程序的集群。几乎任何传统的Unix应用程序(包括Web应用程序,数据库,守护程序和命令行工具)都可以进行容器化,并在集群上运行。群集本身将在每个节点上消耗大约300-500MB的内存和10%的CPU。
设置群集后,您将向其部署Web服务器Nginx,以确保它正确运行工作负载。

在这里插入图片描述
[masters]
k8s-master ansible_host=10.5.5.11 ansible_user=root

[workers]
k8s-node1 ansible_host=10.5.5.21 ansible_user=root
k8s-node2 ansible_host=10.5.5.22 ansible_user=root
k8s-node3 ansible_host=10.5.5.23 ansible_user=root

前提条件
1.Linux / macOS / BSD计算机上的SSH密钥对。如果您之前没有使用过SSH密钥,可以按照如何在本地计算机上设置SSH密钥的说明来学习如何设置它们。
2.运行CentOS 7的三台服务器,每台服务器至少有2GB RAM和2个vCPU。
3.您应该能够以SSH密钥对的root用户身份SSH到每个服务器。请务必将您的公钥添加到主节点上的centos用户帐户。如果您需要有关向特定用户帐户添加SSH密钥的指导,请参阅有关如何在CentOS7上设置SSH密钥的本教程。
4.Ansible安装在您的本地计算机上。有关安装说明,请按照Ansible官方安装文档进行操作。
5. 熟悉Ansible剧本。有关查看,请查看配置管理101:编写Ansible Playbooks。
了解如何从Docker镜像启动容器。如果需要复习,请参阅如何在CentOS 7上安装和使用Docker的“第5步 - 运行Docker容器”。

步骤1 - 设置工作区目录和Ansible清单文件
在本节中,您将在本地计算机上创建一个用作工作区的目录。您还将在本地配置Ansible,以便它可以与远程服务器上的命令通信并执行命令。为此,您将创建一个包含库存信息的主机文件,例如服务器的IP地址和每个服务器所属的组。
在三台服务器中,一台服务器将成为主服务器,其IP显示为master_ip。其他3个服务器将是worker,并且将具有IP . k8s-node1ip和k8s-node2ip . k8s-node3ip。
在本地计算机的主目录中创建一个名为〜/ kube-cluster的目录,然后:
mkdir ~/kube-cluster
cd ~/kube-cluster

该目录将成为本教程其余部分的工作区,并包含所有Ansible剧本。 它也将是您将在其中运行所有本地命令的目录。
使用vi或您喜欢的文本编辑器创建名为〜/ kube-cluster / hosts的文件:
vi ~/kube-cluster/hosts

hosts内容如下:
[masters]
k8s-master ansible_host=10.5.5.11 ansible_user=root

[workers]
k8s-node1 ansible_host=10.5.5.21 ansible_user=root
k8s-node2 ansible_host=10.5.5.22 ansible_user=root
k8s-node3 ansible_host=10.5.5.23 ansible_user=root

完成后,按ESC键,然后按:wq将更改写入文件并退出。
您可能还记得Ansible中的库存文件用于指定服务器信息,例如IP地址,远程用户和服务器分组,以作为执行命令的单个单元进行目标。 〜/ kube-cluster / hosts将是您的库存文件,并且您已向其添加了两个Ansible组(主服务器和工作者),用于指定集群的逻辑结构。
在主服务器组中,有一个名为“master”的服务器条目,列出主节点的IP(master_ip),并指定Ansible应以root用户身份运行远程命令。
同样,在workers组中,有3个工作服务器条目(k8s-node1ip和k8s-node2ip k8s-node3ip),它们也将ansible_user指定为root。
在使用组设置服务器清单之后,让我们继续安装操作系统级依赖关系并创建配置设置。

第2步 - 安装Kubernetes的依赖项
在本节中,您将使用CentOS的yum软件包管理器安装Kubernetes所需的操作系统级软件包。 这些包是:
Docker - 容器运行时。 这是运行容器的组件。 Kubernetes正在积极开发对rkt等其他运行时的支持。
kubeadm - 一个CLI工具,它将以标准方式安装和配置集群的各个组件。
kubelet - 一个在所有节点上运行并处理节点级操作的系统服务/程序。
kubectl - 一种CLI工具,用于通过其API服务器向集群发出命令。
在工作区中创建一个名为〜/ kube-cluster / kube-dependencies.yml的文件:
vi~ / kube-cluster / kube-dependencies.yml

将以下播放添加到文件以将这些包安装到您的服务器:
〜/ KUBE群集/ KUBE-dependencies.yml

  • hosts: all
    become: yes
    tasks:

    • name: install Docker
      yum:
      name: docker
      state: present
      update_cache: true

    • name: start Docker
      service:
      name: docker
      state: started

    • name: disable SELinux
      command: setenforce 0

    • name: disable firewalld
      command: systemctl disalbe firewalld;systemctl stop firewalld;
      ignore_errors: yes

    • name: disable SELinux on reboot
      selinux:
      state: disabled

    • name: ensure net.bridge.bridge-nf-call-ip6tables is set to 1
      sysctl:
      name: net.bridge.bridge-nf-call-ip6tables
      value: 1
      state: present

    • name: ensure net.bridge.bridge-nf-call-iptables is set to 1
      sysctl:
      name: net.bridge.bridge-nf-call-iptables
      value: 1
      state: present

    • name: add Kubernetes’ YUM repository
      yum_repository:
      name: Kubernetes
      description: Kubernetes YUM repository
      baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
      gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
      gpgcheck: yes

    • name: install kubelet
      yum:
      name: kubelet-1.15.0
      state: present
      update_cache: true

    • name: install kubeadm
      yum:
      name: kubeadm-1.15.0
      state: present

    • name: start kubelet
      service:
      name: kubelet
      enabled: yes
      state: started

  • hosts: master
    become: yes
    tasks:

    • name: install kubectl
      yum:
      name: kubectl-1.15.0
      state: present
      allow_downgrade: yes

剧本中的第一部戏剧如下:
安装Docker,容器运行时。
启动Docker服务。
禁用SELinux,因为Kubernetes尚未完全支持它。
设置网络所需的一些与netfilter相关的sysctl值。这将允许Kubernetes设置iptables规则,以便在节点上接收桥接的IPv4和IPv6网络流量。
将Kubernetes YUM存储库添加到远程服务器的存储库列表中。

安装kubelet和kubeadm。
第二个游戏包含一个在主节点上安装kubectl的任务。
注意:虽然Kubernetes文档建议您为您的环境使用最新的Kubernetes稳定版本,但本教程使用特定版本。这将确保您可以成功执行这些步骤,因为Kubernetes快速更改,并且最新版本可能无法与本教程一起使用。
完成后保存并关闭文件。
接下来,执行playbook:
ansible-playbook -i hosts~ kube-dependencies.yml

完成后,您将看到类似于以下内容的输出:
Output
PLAY [all] ****


PLAY RECAP ****
k8s-master : ok=9 changed=5 unreachable=0 failed=0
k8s-node1 : ok=7 changed=5 unreachable=0 failed=0
k8s-node2 : ok=7 changed=5 unreachable=0 failed=0

执行后,Docker,kubeadm和kubelet将安装在所有远程服务器上。 kubectl不是必需组件,仅用于执行集群命令。在此上下文中仅在主节点上安装它是有意义的,因为您将仅从主服务器运行kubectlcommands。但是,请注意,kubectl命令可以从任何工作节点运行,也可以从可以安装和配置为指向集群的任何计算机运行。
现在已安装所有系统依赖项。让我们设置主节点并初始化集群。
第4步 - 设置主节点
在本节中,您将设置主节点。但是,在创建任何Playbooks之前,值得介绍一些概念,例如Pod和Pod网络插件,因为您的群集将同时包含这两个概念。
pod是运行一个或多个容器的原子单元。这些容器共享资源,例如文件卷和网络接口。 Pod是Kubernetes中的基本调度单元:pod中的所有容器都保证在调度pod的同一节点上运行。
每个pod都有自己的IP地址,一个节点上的pod应该能够使用pod的IP访问另一个节点上的pod。单个节点上的容器可以通过本地接口轻松进行通信。然而,pod之间的通信更复杂,并且需要单独的网络组件,该组件可以透明地将来自一个节点上的pod的流量路由到另一个节点上的pod。
此功能由pod网络插件提供。对于这个群集,您将使用Flannel,一个稳定且高性能的选项。
在本地计算机上创建一个名为master.yml的Ansible playbook:
vi~ / kube-cluster / master.yml

将以下播放添加到文件以初始化集群并安装Flannel:
~/kube-cluster/master.yml

  • hosts: master
    become: yes
    tasks:
    • name: initialize the cluster
      shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt
      args:
      chdir: $HOME
      creates: cluster_initialized.txt

    • name: create .kube directory
      become: yes
      become_user: centos
      file:
      path: $HOME/.kube
      state: directory
      mode: 0755

    • name: copy admin.conf to user’s kube config
      copy:
      src: /etc/kubernetes/admin.conf
      dest: /home/centos/.kube/config
      remote_src: yes
      owner: centos

    • name: install Pod network
      become: yes
      become_user: centos
      shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml >> pod_network_setup.txt
      args:
      chdir: $HOME
      creates: pod_network_setup.txt

这是这个戏剧的细分:
第一个任务是通过运行kubeadm init来初始化集群。传递参数–pod-network-cidr = 10.244.0.0 / 16指定将从中分配pod IP的私有子网。法兰绒默认使用上述子网;我们告诉kubeadm使用相同的子网。
第二个任务在/ home / centos创建一个.kube目录。此目录将保存配置信息,例如连接到群集所需的管理密钥文件以及群集的API地址。
第三个任务将从kubeadm init生成的/etc/kubernetes/admin.conf文件复制到非root centos用户的主目录。这将允许您使用kubectl访问新创建的集群。
最后一个任务运行kubectl申请安装法兰绒。 kubectl apply -f描述符。[yml | json]是告诉kubectl创建描述符。[yml | json]文件中描述的对象的语法。 kube-flannel.yml文件包含在集群中设置Flannel所需的对象的描述。
完成后保存并关闭文件。
执行剧本:
ansible-playbook -i hosts . master.yml

完成后,您将看到类似于以下内容的输出:
Output

PLAY [master] ****…
PLAY RECAP ****
master : ok=5 changed=4 unreachable=0 failed=0

要检查主节点的状态,请使用以下命令通过SSH连接到该节点:
ssh centos@master_ip

进入主节点后,执行:
kubectl获取节点

您现在将看到以下输出:
产量
名称状态改变年龄版本
master Ready master 1d v1.15.0

输出指出主节点已完成所有初始化任务,并且处于Readystate中,它可以从该状态开始接受工作节点并执行发送到API服务器的任务。您现在可以从本地计算机添加工作程序。
第5步 - 设置工作节点
将工作程序添加到集群涉及在每个集群上执行单个命令。此命令包括必要的群集信息,例如主服务器API服务器的IP地址和端口以及安全令牌。只有传入安全令牌的节点才能加入群集。
导航回您的工作区并创建一个名为workers.yml的剧本:
vi workers.yml

将以下文本添加到文件中以将工作程序添加到集群:
~/kube-cluster/workers.yml

  • hosts: master
    become: yes
    gather_facts: false
    tasks:

    • name: get join command
      shell: kubeadm token create --print-join-command
      register: join_command_raw

    • name: set join command
      set_fact:
      join_command: “{{ join_command_raw.stdout_lines[0] }}”

  • hosts: workers
    become: yes
    tasks:

    • name: join cluster
      shell: “{{ hostvars[‘master’].join_command }} --ignore-preflight-errors all >> node_joined.txt”
      args:
      chdir: $HOME
      creates: node_joined.txt

这是剧本的作用:
第一个play获取需要在worker节点上运行的join命令。 此命令将采用以下格式:
kubeadm join --token : --discovery-token-ca-cert-hash sha256:。
一旦它获得具有适当的令牌和哈希值的实际命令,该任务就将其设置为事实,以便下一个游戏将能够访问该信息。
第二个游戏有一个任务,它在所有工作节点上运行join命令。 完成此任务后,两个工作节点将成为群集的一部分。
完成后保存并关闭文件。
执行剧本:
ansible-playbook -i hosts workers.yml

完成后,您将看到类似于以下内容的输出:

通过添加工作节点,您的群集现在已完全设置并正常运行,工作人员可以准备好运行工作负载。 在安排应用程序之前,让我们验证群集是否按预期工作。
第6步 - 验证群集
集群有时可能在安装过程中失败,因为节点已关闭或主服务器与工作服务器之间的网络连接无法正常工作。 让我们验证集群并确保节点正常运行。
您需要从主节点检查群集的当前状态,以确保节点已准备就绪。 如果从主节点断开连接,则可以使用以下命令通过SSH将其重新连接到主节点:
ssh centos@master_ip

然后执行以下命令以获取集群的状态:
kubectl get nodes

您将看到类似于以下内容的输出:
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3h v1.15.0
k8s-node1 Ready 173m v1.15.0
k8s-node2 Ready 174m v1.15.0
k8s-node3 Ready 171m v1.15.0

如果所有节点都具有Ready for STATUS值,则表示它们是群集的一部分并准备好运行工作负载。
但是,如果一些节点将NotReady作为STATUS,则可能意味着工作节点尚未完成其设置。等待大约五到十分钟,然后重新运行kubectl get节点并检查新输出。如果少数节点仍具有NotReady作为状态,则可能必须验证并重新运行前面步骤中的命令。
现在您的集群已成功验证,让我们在集群上安排一个示例Nginx应用程序。
步骤7 - 在群集上运行应用程序
您现在可以将任何容器化应用程序部署到您的群集。为了保持熟悉,让我们使用部署和服务部署Nginx,以了解如何将此应用程序部署到集群。如果更改Docker映像名称和任何相关标志(如端口和卷),也可以将以下命令用于其他容器化应用程序。
仍在主节点内,执行以下命令以创建名为nginx的部署:

kubectl create deployment nginx --image=nginx

deployment是一种Kubernetes对象,可确保始终根据已定义的模板运行指定数量的pod,即使pod在群集生命周期内崩溃也是如此。上面的部署将使用Docker注册表的Nginx Docker Image创建一个包含一个容器的pod。
接下来,运行以下命令以创建名为nginx的服务,该服务将公开公开该应用程序。它将通过NodePort实现,该方案将通过在群集的每个节点上打开的任意端口访问pod:
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort

服务是另一种类型的Kubernetes对象,它向内部和外部客户端公开集群内部服务。它们还能够对多个pod进行负载均衡请求,并且是Kubernetes中不可或缺的组件,经常与其他组件交互。
运行以下命令:
kubectl get services

[centos@k8s-master ~]$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 3h1m
nginx LoadBalancer 10.98.147.200 80:30924/TCP 166m

从上面输出的第三行,您可以检索运行Nginx的端口。 Kubernetes将自动分配一个大于30000的随机端口,同时确保该端口尚未受到其他服务的约束。
要测试一切是否正常,请通过本地计算机上的浏览器访问http://k8s-node1:nginx_port或http://k8s-node2:nginx_port . http://k8s-node3:nginx_port

您将看到Nginx熟悉的欢迎页面。
在这里插入图片描述
如果要删除Nginx应用程序,请先从主节点删除nginx服务:
kubectl delete service nginx

运行以下命令以确保已删除该服务:
kubectl get services

You will see the following output:
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 1d

然后删除部署:
kubectl delete deployment nginx

运行以下命令以确认这是否有效:
kubectl get deployments

输出:
找不到资源。

最后:
部署dashboard

[centos@k8s-master ~]$ more kubernetes-dashboard.yaml
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# ------------------- Dashboard Secrets ------------------- #

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kube-system
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kube-system
type: Opaque
data:
  csrf: ""

---
# ------------------- Dashboard Service Account ------------------- #

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system

---
# ------------------- Dashboard Role & Role Binding ------------------- #

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create"]
  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["create"]
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
  verbs: ["get", "update", "delete"]
  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["kubernetes-dashboard-settings"]
  verbs: ["get", "update"]
  # Allow Dashboard to get metrics from heapster.
- apiGroups: [""]
  resources: ["services"]
  resourceNames: ["heapster"]
  verbs: ["proxy"]
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  verbs: ["get"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

---
# ------------------- Dashboard Deployment ------------------- #

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
    spec:
      containers:
      - name: kubernetes-dashboard
        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
        ports:
        - containerPort: 8443
          protocol: TCP
        args:
          - --auto-generate-certificates
          # Uncomment the following line to manually specify Kubernetes API server Host
          # If not specified, Dashboard will attempt to auto discover the API server and connect
          # to it. Uncomment only if the default does not work.
          # - --apiserver-host=http://my-address:port
        volumeMounts:
        - name: kubernetes-dashboard-certs
          mountPath: /certs
          # Create on-disk volume to store exec logs
        - mountPath: /tmp
          name: tmp-volume
        livenessProbe:
          httpGet:
            scheme: HTTPS
            path: /
            port: 8443
          initialDelaySeconds: 30
          timeoutSeconds: 30
      volumes:
      - name: kubernetes-dashboard-certs
        secret:
          secretName: kubernetes-dashboard-certs
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

---
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

[centos@k8s-master ~]$ kubectl apply -f kubernetes-dashboard.yaml

添加用户:

[centos@k8s-master ~]$ more users.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system

[centos@k8s-master ~]$ kubectl apply -f users.yaml

设置代理:
[centos@k8s-master ~]$ kubectl --namespace kube-system port-forward svc/kubernetes-dashboard --address 0.0.0.0 8443:443

生成Token:
[centos@k8s-master ~]$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin | awk ‘{print $1}’)
Name: admin-token-gk9g2
Namespace: kube-system
Labels:
Annotations: kubernetes.io/service-account.name: admin
kubernetes.io/service-account.uid: 78dd6df4-ffcb-4db1-bcd3-09ab9d17167a

Type: kubernetes.io/service-account-token

Data

token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi10b2tlbi1nazlnMiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijc4ZGQ2ZGY0LWZmY2ItNGRiMS1iY2QzLTA5YWI5ZDE3MTY3YSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbiJ9.UhBkLfT8XG0ZObHWcZUu1YImtKYDIrqnHsgf367K4To_o7onP71T_1xmLKOsZbuhl6IkzYCPmBpP5DE9xnoxJ6D3x3TamQ_HIEZ2SNDX7QBEq-S2YmigvZljgvhL5ugMJJYHfr95uNg-GVEdFSwbnRHuIznKFaNoyEZfP7UMv6GNYZiCmI2zB_W0ZZ3zf7BO-vr-an37KEOEba7Gsta8mYf6WTGQe1Gwa9iSQwJK2ZMzcibWhZkPw2QJJ0rxdSOzsXOXFj-IcG_sgZ9jZtbfbP00XtW-ATMIRHBLLWzbimZch9gAAb_-AQkoy32TT4VksU_crvDe5iJ1TSgDN2KxAA
ca.crt: 1025 bytes
namespace: 11 bytes

打开浏览器:
在这里插入图片描述

在这里插入图片描述

遇到的坑,或最难的部分:

  1. 翻墙问题,镜像和 yaml 都是来自国外,没有fan . qiang 是安装不了的 。
  2. 可以从国内镜像源下载相关镜像。
    1. /boot/下面要有对应的当前运行内核的配置文件config-$(uanem -r)
  3. 记得要关闭swap 执行: swapoff -a 然后vi /etc/fstab 把swap 分区前面加个 #
    5在这里插入图片描述
  4. 我的centos7 1810 内核是升级过的,之前 /boot/目录下没有对应的版本,只能1. 降低到低版本的
    config-3.10.0-957.21.3.el7.x86_64 或者重新编译安装新的内核,我是重新编译了最新的LT内核。config-4.19.55

[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
[WARNING Hostname]: hostname “kube-master” could not be reached
[WARNING Hostname]: hostname “kube-master”: lookup kube-master on 114.114.114.114:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Swap]: running with swap on is not supported. Please disable swap
[ERROR SystemVerification]: failed to parse kernel config: unable to load kernel module: “configs”, output: “modprobe: FATAL: Module configs not found.\n”, err: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with --ignore-preflight-errors=...

6。如果ansible 部署有问题,可以手动执行,确保操作等价即可。

结论
在本指南中,您已使用Kubeadm和Ansible在CentOS 7上成功建立了Kubernetes集群,以实现自动化。
如果您想知道如何在群集设置的情况下对群集进行操作,那么下一步就是将自己的应用程序和服务部署到群集上。这是一个链接列表,其中包含可以指导您完成此过程的更多信息:
Dockerizing应用程序 - 列出了详细说明如何使用Docker对应用程序进行容器化的示例。
Pod概述 - 详细描述了Pod如何工作以及它们与其他Kubernetes对象的关系。豆荚在Kubernetes中无处不在,因此了解它们将有助于您的工作。
部署概述 - 这提供了部署的概述。了解部署控制器如何工作非常有用,因为它们在无状态应用程序中经常用于扩展和不健康应用程序的自动修复。
服务概述 - 这包括服务,Kubernetes集群中另一个常用对象。了解服务类型及其选项对于运行无状态和有状态应用程序至关重要。
您可以研究的其他重要概念是Volumes,Ingresses和Secrets,所有这些在部署生产应用程序时都会派上用场。
Kubernetes提供了许多功能和特性。 Kubernetes官方文档是了解概念,查找特定于任务的指南以及查找各种对象的API参考的最佳位置。

Logo

开源、云原生的融合云平台

更多推荐