一、K8s快速入门

1. 简介

kubernetes简称k8s。是用于自动部署、可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。

中文官网:https://kubernetes.io/Zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:https://docs.kubernetes.org.cn/

部署方式的进化:

在这里插入图片描述
详细请访问官方文档:https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/

2. 架构

文档:https://kubernetes.io/zh/docs/concepts/overview/components/

在这里插入图片描述

1)master节点架构

  • kube-apiserver

    • 对外暴露 k8s 的 api 接口,是外界进行资源操作的唯一入口
    • 提供认证、授权、访问控制、API 注册和发现等机制
  • etcd

    • etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
    • Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
  • kube-scheduler

    • 主节点上的组件,负责监视新创建的、未指定运行节点(node)的 Pods,并选择节点让 Pod 在上面运行。
    • 对所有 k8s 集群的操作,都必须经过主节点进行调度
  • kube-controller-manager:在主节点上运行控制器进程的组件

    这些控制器包括:

    • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
    • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
    • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
    • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

2)Node节点架构

  • kubelet

    • 一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
    • 负责维护窗口的生命周期,同时也负责 Volume (CSI) 和网络 (CIN) 的管理
  • kube-proxy

    • kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
    • kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
  • 容器运行时(Container Runtime)

    • 容器运行环境是负责运行容器的软件。
    • Kubernetes 支持多个容器运行环境:Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。
  • fluentd

    • 是一个守护进程,它有助于提供集群层面日志

3. 概念

在这里插入图片描述

  • Container:容器,可以是 docker 启动的一个容器

  • Pod
    在这里插入图片描述

    • k8s 使用 Pod 来组织一组容器
    • 一个 Pod 中的所有容器共享同一网络。
    • Pod 是 k8s 中的最小部署单元
  • Volume

    • 声明在 Pod 容器中可访问的文件目录
    • 可以被挂载在Pod中一个或多个容器指定路径下
    • 支持多种后端存储抽象(本地存储,分布式存储,云存储)
  • Controllers:更高层次对象,部署和管理Pod;

    • ReplicaSet:确保预期的 Pod 副本数量
    • Deplotment:无状态应用部署
    • StatefulSet:有状态应用部署,例如 Mysql
    • DaemonSet:确保所有Node都运行一个指定Pod
    • Job:一次性任务
    • Cronjob:定时任务
  • Deployment

    • .定义一组 Pod 的副本数目、版本等
    • 通过控制器 (Controller) 维持 Pod 数目(自动回复失败的 Pod)
    • 通过控制器以指定的策略控制版本(滚动升级,回滚等)
  • Service

    • 定义一组 Pod 的访问策略
    • Pod 的负载均衡,提供一个或者多个 Pod 的稳定访问地址
    • 支持多种方式(ClusterlP、 NodePort、 LoadBalance)
  • Label:标签,用于对象资源的查询,筛选

  • Namespace:命名空间,逻辑隔离

    • 一个集群内部的逻辑隔离机制 (鉴权.资源)
    • 每个资源都属于一个 namespace
    • 同一个 namespace 所有资源名不能重复
    • 不同 namespace 可以资源名重复
  • API:我们通过 kubernetes 的 API 来操作整个集群。

    • 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给 API Server,然后控制 k8s 集群。k8s 里的所有的资源对象都可以采用 yamlJSON 格式的文件定义或描述

二、K8s集群安装

1. 前置要求

  1. 准备一台或多台机器,操作系统 Centos7.x-86_x64。我的配置 3 台 Centos7
  2. 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多。我的配置 2核 2G 64G
  3. 集群中所有的机器之间网络互通
  4. 可以访问外网,需要拉取镜像

2. 配置Linux环境(所有节点都执行)

  1. 关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld
    
  2. 关闭 selinux

    sed -i 's/enforcing/disabled/' /etc/selinux/config
    setenforce 0
    
  3. 关闭swap

    swapoff -a #临时关闭
    sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
    free -g #验证,swap必须为0
    
  4. 添加主机名与IP对应关系:

    查看主机名:

    hostname
    

    如果主机名不正确,可以通过 hostnamectl set-hostname <newhostname> 命令来指定新的 hostname。我的三台节点名:k8s-node1,k8s-node2,k8s-node3

    在三台机器中配置 /etc/hosts 以便可以互相通过 hostname 访问

    vim /etc/hosts
    10.211.55.19 k8s-node1	# 这里的IP要修改成hostname对应节点的IP
    10.211.55.21 k8s-node2
    10.211.55.20 k8s-node3
    
  5. 将桥接的 IPV4 流量传递到 iptables 的链:

    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    

    应用规则:

    sysctl --system
    
  6. date 查看时间(可选)

yum -y install ntpupdate
ntpupdate time.window.com #同步最新时间

3. 所有节点安装 docker、kubeadm、kubelet、kubectl

Kubenetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。

1)安装Docker

  1. 卸载之前的docker

    $ sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装Docker -CE

    $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 设置 docker repo 的 yum 位置
    $ sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
        
    $ sudo yum -y install docker-ce docker-ce-cli containerd.io
    
  3. 配置镜像加速
    registry-mirrors 后面使用自己的镜像加速地址,可以从阿里云镜像加速器获取

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    	"exec-opts": ["native.cgroupdriver=systemd"],
    	"log-driver": "json-file",
    	"log-opts": {
    		"max-size": "100m" 
    	},
      	"registry-mirrors": ["https://r1fl0qlt.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  4. 启动 Docker 并且设置 Docker 开机启动

    sudo systemctl enable docker
    

2)添加阿里与Yum源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3)安装 kubeadm,kubelet 和 kubectl

安装

yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3

开机启动

systemctl enable kubelet && systemctl start kubelet

查看kubelet的状态:

systemctl status kubelet

查看 kubelet 版本:

> kubelet --version
Kubernetes v1.17.3

4)部署k8s-master

(1)master节点初始化

初始化 kubeadm,下面的命令会下载 k8s 组件的镜像:

$ kubeadm init \
--apiserver-advertise-address=10.211.55.19 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16  \
--pod-network-cidr=10.244.0.0/16

参数说明:

  • --apiserver-advertise-address:这里的IP地址要修改成自己 master 主机的地址,我使用的是为三台机器中的第一台 k8s-node1
  • --kubernetes-version:配置成自己安装的版本,和上一步 kubeadm 的版本一致,kubelet --version 查看版本

注意:如果执行上面的初始化命令报错了,下次再执行初始化命令前,先执行 kubeadm reset -f

执行结果:
如果看到下面的页面,则说明初始化成功
在这里插入图片描述

初始化完节点之后,根据日志的提示先执行这三条命令:

# 这个目录会保存连接配置
mkdir -p $HOME/.kube

# 认证文件保存到这个目录下
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
(2)安装 flannel

安装CNI网络插件,这里安装 flannel

创建个 flannel 的目录,

  1. 下载 yml 文件:

    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

    如果上面的网址下载不下来,就去 码云 flannel 上把这个 yml 文件复制或者下载下来

  2. 创建 flannel

    kubectl create -f kube-flannel.yml
    
  3. 查看是否成功运行
    可以看到 kube-flannel 是运行状态:

    [root@k8s-node1 flannel]# kubectl get pods --all-namespaces
    NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
    kube-system   coredns-7d89d9b6b8-bjmsp            1/1     Running   0          36m
    kube-system   coredns-7d89d9b6b8-z46zp            1/1     Running   0          36m
    kube-system   etcd-k8s-node1                      1/1     Running   1          37m
    kube-system   kube-apiserver-k8s-node1            1/1     Running   1          37m
    kube-system   kube-controller-manager-k8s-node1   1/1     Running   1          37m
    kube-system   kube-flannel-ds-srf9w               1/1     Running   0          65s
    kube-system   kube-proxy-n64fp                    1/1     Running   0          36m
    kube-system   kube-scheduler-k8s-node1            1/1     Running   1          37m
    

5)添加从节点

  1. 查看所有节点(主节点运行)

    #获取所有节点
    $ kubectl get nodes
    NAME        STATUS   ROLES                  AGE   VERSION
    k8s-node1   Ready    control-plane,master   40m   v1.22.2
    
  2. 获取 Node 节点加入命令

    $ kubeadm token create --print-join-command
    kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
    
  3. 在从节点运行输出的命令

    $ kubeadm join 10.37.132.5:6443 --token yzd8bg.mzdp8ua5cyuggpdp --discovery-token-ca-cert-hash sha256:71216e7189e48bfedac9fce79c9dd6920b3354ff62023e7ea069848fa84a3861
    
  4. 查看节点状态

    $ kubectl get nodes
    NAME        STATUS   ROLES                  AGE     VERSION
    k8s-node1   Ready    control-plane,master   68m     v1.22.2
    k8s-node2   Ready    <none>                 4m16s   v1.22.2
    k8s-node3   Ready    <none>                 4m12s   v1.22.2
    
    $ journalctl -u kubelet #查看kubelet日志
    

监控pod进度

watch kubectl get pod -n kube-system -o wide

等到所有的status都变为running状态后,再次查看节点信息:

[root@k8s-node1 ~]#  kubectl get nodes;                         NAME        STATUS   ROLES    AGE     VERSIONk8s-node1   Ready    master   3h50m   v1.17.3k8s-node2   Ready    <none>   3h3m    v1.17.3k8s-node3   Ready    <none>   3h3m    v1.17.3[root@k8s-node1 ~]# 

三、入门操作kubernetes集群

1. k8s上部署一个tomcat

kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8

其它命令:

# 获取所有的资源
$ kubectl get all

# 获取所有资源的详细信息
$ kubectl get all -o wide

# 获取 pods 的信息
kubectl get pods

2. 向外暴露端口

在master上执行

kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort 
  • --port=80:pod 中的端口 80 映射;server 会带来 pod 的 80
  • --target-port=8080:容器中的端口 8080,会与 pod 中的 80 映射
  • --type=NodePort:Service 的一种类型,为 Service 在每台机器上绑定一个端口,这样就可以通过 NodeIp:NodePort 来访问该服务

查看服务,访问 k8s-node1:30916 (30916 是service自动分配的,服务器的 30916 端口,映射 pod 中的 80 端口)就可以访问到 tomcat :

# 查看 service 的信息
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        91m
tomcat6      NodePort    10.96.96.4   <none>        80:30916/TCP   12s

3. 动态扩容测试

# 查看deployment,只有一个副本
$ kubectl get deployment
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
tomcat6   1/1     1            1           8m44s

# 扩容成3个副本
$ kubectl scale --replicas=3 deployment tomcat6
deployment.apps/tomcat6 scaled

# 可以看到正在扩容中
$ kubectl get deployment
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
tomcat6   2/3     3            2           9m35s

4. 删除

$ kubectl get deployment
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
tomcat6   3/3     3            3           12m

$ kubectl delete deployment tomcat6
deployment.apps "tomcat6" deleted

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP        91m
tomcat6      NodePort    10.96.96.4   <none>        80:30916/TCP   12s

$ kubectl delete service tomcat6
service "tomcat6" deleted

5. 格式化输出 yaml

# 打印前面部署 Tomcat 时使用的命令对应的 yaml
$ kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run='client' -o=yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: tomcat6
  name: tomcat6
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat6
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: tomcat6
    spec:
      containers:
      - image: tomcat:6.0.53-jre8
        name: tomcat
        resources: {}
status: {}
  • --dry-run:值必须为none(默认)、serverclient。如果是 client 策略,则只打印该发送对象,但不发送它。如果 server 策略,提交服务器端请求而不持久化资源。
  • -o:输出格式,可以是 jsonyamlwide 等等。

6. 使用 yaml 部署 tomcat

  1. 使用前一步打印的 yaml,删除一些无用配置,将 replicas 改成 3,使用 yaml 文件部署 3Tomcat

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: tomcat6
      name: tomcat6
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: tomcat6
      template:
        metadata:
          labels:
            app: tomcat6
        spec:
          containers:
          - image: tomcat:6.0.53-jre8
            name: tomcat
    
  2. 将上面的 yaml 保存至一个文件中 tomcat6.yaml

    $ kubectl apply -f tomcat6.yaml
    
    • apply:表示创建或者更新资源,删除则用 delete
    • -f:指定指定 yaml 文件

    查看 pod 的 yaml:

    # 查看 pod
    $ kubectl get pods
    NAME                       READY   STATUS    RESTARTS   AGE
    tomcat6-56fcc999cb-b4nt7   1/1     Running   0          2m49s
    tomcat6-56fcc999cb-pncn9   1/1     Running   0          2m49s
    tomcat6-56fcc999cb-wczpj   1/1     Running   0          2m49s
    
    # 查看 pod 的 yaml
    $ kubectl get pods tomcat6-56fcc999cb-b4nt7 -o yaml
    
  3. 删除用 yaml 创建的 Tomcat

    $ kubectl delete -f tomcat6.yaml
    

7. 一些官方文档

1)kubectl 操作文档

https://kubernetes.io/zh/docs/reference/kubectl/overview/

2)资源类型

https://kubernetes.io/zh/docs/reference/kubectl/overview/#%e8%b5%84%e6%ba%90%e7%b1%bb%e5%9e%8b

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐