k8s基本概念及安装使用教程

一、Kubernetes(k8s)基本概念

  • 是Google开源的一个容器编排引擎,用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便管理与发现,用于管理云平台中多个主机上的容器化的应用

  • k8s的目标是让部署容器化的应用简单并且高效,很多细节都不需要去手工配置与处理

  • 采用Go语言开发

  • Kubernetes管理员认证(CKA)

    全球k8s管理员认证,考试只允许查阅官方文档

    • https://kubernets.io/
    • https://github.com

基本概念理解:https://blog.csdn.net/TM6zNf87MDG7Bo/article/details/79621510

1. 整体架构

k8s基本概念及安装使用教程_第1张图片

  • 高可用集群副本数最好是>=3的奇数
  • Master:集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求
    • API Server:所有服务访问的统一入口
    • Scheduler:负责介绍任务,选择合适的节点进行分配任务
    • ClusterState Store(etcd数据库):键值对数据库,储存k8s集群所有重要信息(持久化)
    • Controller ManagerServer:维持副本期望数目
  • Nodes:集群工作节点,运行用户业务应用容器
    • kubelet :直接跟容器引擎交互实现容器的生命周期管理
    • kube proxy :负责写入规则至IPTABLES、IVPS,实现服务映射访问
    • pod (Container Runtime)
  • 其他插件
    • CoreDNS:可以为集群中的svc创建一个域名ip的对应关系解析
    • Dashboard:给k8s汲取提供一个B/S结构访问体系
    • Ingress Controller:官方只能实现四层代理,Ingress可以试下 7层
    • Federation:提供一个可以跨集群中心多k8s统一管理功能
    • Prometheus:提供k8s集群的监控能力
    • ELK:提供k8s集群日志统一分析接入平台

2. Pod

控制器管理的Pod

  • ReplicationController & ReplicaSet & Deployment
    • ReplicationController用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;而如果异常多出来的容器也会自动回收
    • ReplicaSet与ReplicationController类似,且支持集合式的selector(新版本的k8s建议使用ReplicaSet)
    • 虽然ReplicaSet可以独立使用,但一般还是建议使用Deployment来自动管理ReplicaSet。这样就无需担心与其他机制的不兼容问题(比如ReplicaSet不支持rolling-update滚动更新)
  • HPA(horizontal Pod Autoscaling)仅适用于Deployment和ReplicaSet,在V1版本中仅支持根据pod的cpu利用率扩缩容,在vlapha版本中,支持根据内存和用户自定义的metric扩缩容
  • StatefulSet:为了解决有状态服务的问题(对应Deployment和ReplicaSet是为无状态服务而设计)应用场景包括:
    • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
    • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于headless service(即没有Cluster IP的Service)来实现
    • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要根据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod都必须是Running和Ready状态)
    • 有序收缩,有序删除(即从N-1到0)
  • DaemonSet:确保全部或一些node上运行一个pod的副本。当有node加入集群时,也会为其新增一个pod。当有node从集群移除时,这些pod也会回收。删除DaemonSet将胡i删除它创建的所有Pod。典型用法:
    • 运行集群存储daemon,例如在每个node上运行glusterd、ceph
    • 在每个node上运行日志收集daemon,例如fluentd、logstash
    • 在每个Node上运行监控daemon,例如promethus node exporter
  • Job:负责批处理任务,即仅执行依次的任务,它保证批处理任务的一个或多个Pod成功结束
    • Cron Job管理基于时间的Job,即:
      • 在给定时间点只运行一次
      • 周期性地在给定时间点运行

3. 网络通讯方式

k8s的网络模型假定了所有的pod都在一个可以直接连通的扁平的网络空间中,这在GCE里面是线程的网络模型,k8s假定这个网络已经存在。而在私有云里搭建k8s集群,就不能假定这个网络已经存在。需要自己实现这个网络假设,将不同节点上的docker容器之间的互相访问先打通,然后运行k8s

  • 同一个Pod内的多个容器之间:localhost
  • 各Pod之间的通讯:Overlay Network
  • Pod与Service之间的通讯:各节点的Iptables

二、环境搭建

部署k8s环境(集群)主要有多种方式

  • (1)minikube:在本地运行k8s的工具,可以在个人计算机上运行一个单节点k8s集群,以便试用k8s或进行日常开发工作

    在线工具:https://kubernetes.io/docs/tutorials/hello-minikube/

  • (2)kind:与minikube类似,可以在本地运行,但需要安装并配置Docker

    https://kind.sigs.k8s.io/

  • (3)kubeadm:k8s部署工具,提供kubeadm init和kubeadm join两个操作命令,可以快速部署一个k8s集群

    官方文档:

    https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

    https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

  • (4)二进制包:从GitHub下载发行版的二进制包,手动安装部署每个组件,组成kubernetes集群,步骤较为繁琐,但能加强对各个组件的认识

  • (5)yum安装:yum源里面的k8s版本较老,不推荐

  • (6)第三方工具或者直接购买类似阿里云这样的公有云平台k8s

Kubeadm部署kubernetes

kubeadm是官方社区推出的一个用于快速部署k8s集群的工具,这个工具能够通过两条指令完成一个k8s集群的部署

  • 1、创建一个Master 节点
kubeadm init
  • 2、将Node节点加入到Master集群中
kubeadm join <master节点的ip和端口>

k8s部署环境要求

  • 一台或多台机器 centos7.x-86_x64
  • 硬件:内存2G+,CPU 2核
  • 集群间的各个机器之间能相互通信
  • 集群内各个机器可以访问外网,需要拉取镜像
  • 禁止swap分区

1、kubeadm部署k8s环境准备

在staging搭建的两个服务器作为测试

  • master:192.168.14.97 10.10.15.189

  • node01:192.168.14.161 10.10.11.249

以下操作需要两台服务器都执行

#关闭防火墙(云服务器不用)
systemctl stop firewalld
systemctl disable firewald

#关闭selinux(好像云服务器不用此操作)
sed -i 's/enforcing/disabled' /etc/selinux/config     #永久(永久操作需重启电脑)
setenforce 0   #临时

#关闭swap(k8s禁止虚拟内存以提高性能)
sed -ri 's/.*swap.*/#&/' /etc/fstab     #永久
swapoff -a    #临时

#修改主机名
hostnamectl set-hostname master
hostnamectl set-hostname node01

#在master中添加hosts(或者直接编辑该文件)
cat >> /etc/hosts << EOF
10.10.15.189  master
10.10.11.249  node01
EOF

#设置网桥参数
sysctl -w net.ipv4.ip_forward=1

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

#时间同步
yum install ntpdate -y
ntpdate time.windows.com
ntpdate -u 210.72.145.44
#输入date查看当前时间

2、k8s安装具体步骤

所有服务器节点安装Docker、kubeadm、kubelet

(1)安装Docker

  • k8s默认容器运行环境是Docker,因此需要先安装Docker

  • 设置Cgroup Driver安装完成后,需设置Docker的daemon.json,增加exec-opts

    vi /etc/docker/daemon.json
    {
           
      "registry-mirrors": ["https://lwj5lfe1.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

(2)安装kubelet kubeadm 和kubectl(需要在所有服务器上执行)

kubelet:运行在cluster的所有节点上,负责启动POD和容器

kubeadm :用于初始化cluster

kubectl:是k8s的命令行工具,通过kubectl可以部署和管理应用,查看各种资源、创建、删除和更新组件

  • 安装:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11Cg7Ixy

    #添加k8s的阿里云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
    
    #关闭selinux(之前执行过可不用)
    setenforce 0
    
    #安装kubelet kubeadm 和kubectl,可指定版本(当前默认是最新版本1.22.1-0)
    yum install -y kubelet kubeadm kubectl
    yum install kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 -y
    
    #设置开机自启
    systemctl enable kubelet && systemctl start kubelet
    
    #查看安装是否成功
    yum list installed | grep kubelet
    yum list installed | grep kubeadm
    yum list installed | grep kubectl
    #查看安装的版本
    kubelet --version
    Kubernetes v1.21.2
    

(3)拉取镜像

  • #1、使用kubeadm命令查看当前k8s所需镜像版本
    kubeadm config images list
    
    k8s.gcr.io/kube-apiserver:v1.21.5
    k8s.gcr.io/kube-controller-manager:v1.21.5
    k8s.gcr.io/kube-scheduler:v1.21.5
    k8s.gcr.io/kube-proxy:v1.21.5
    k8s.gcr.io/pause:3.4.1
    k8s.gcr.io/etcd:3.4.13-0
    k8s.gcr.io/coredns/coredns:v1.8.0
    #2、编写脚本
    vi images.sh
    
    
    #!/bin/bash
    url=registry.cn-hangzhou.aliyuncs.com/google_containers
    # 安装指定的kubectl版本
    version=v1.21.2
    # 上面查出来的coredns版本号
    coredns=1.8.0
    images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
    for imagename in ${images[@]} ; do
       if [ $imagename = "coredns" ]
       then
          docker pull $url/coredns:$coredns
          docker tag $url/coredns:$coredns k8s.gcr.io/coredns/coredns:v1.8.0
          docker rmi -f $url/coredns:$coredns
       else
          docker pull $url/$imagename
          docker tag $url/$imagename k8s.gcr.io/$imagename
          docker rmi -f $url/$imagename
      fi
    done
    
    
    #3、修改images.sh脚本权限,改为可执行权限。
    chmod +x images.sh
    
    #4、执行脚本,拉取镜像
    ./images.sh
    
    #查看镜像 docker images
    

(4)初始化k8s集群

  • 该命令只需在master节点上执行

    #初始化k8s集群(该命令只需在master节点上执行)
    kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.10.16.38 --pod-network-cidr=10.244.0.0/16
    
    --kubernetes-version # 指定的版本
    --apiserver-advertise-address # K8S主节点的地址
    --pod-network-cidr # pod的网络IP范围
    
    #如果遇到unexpected kernel config: CONFIG_CGROUP_PIDS
    #       [ERROR SystemVerification]: missing required cgroups: pids
    
     #需要升级内核,重置
     kubeadm reset
     
     #cat /boot/config-uname | grep CGROUP在这个文件里面加 CONFIG_CGROUP_PIDS=y,如:
     
     #内核升级参考
     https://blog.csdn.net/wulinpingailxr/article/details/96480526
    
  • 初始化成功后会生成以下命令

    Your Kubernetes control-plane has initialized successfully!
    
    To start using your cluster, you need to run the following as a regular user:
    
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    Alternatively, if you are the root user, you can run:
    
      export KUBECONFIG=/etc/kubernetes/admin.conf
    
    You should now deploy a pod network to the cluster.
    Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
    
    Then you can join any number of worker nodes by running the following on each as root:
    
    kubeadm join 10.10.15.189:6443 --token yourtoken \
            --discovery-token-ca-cert-hash sha256:hashvalue
    
  • 执行k8s集群初始化生成的创建目录和复制配置文件命令。

    #在master节点上执行
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    #在node节点上得根目录下/,执行生成得加入k8s集群命令
    kubeadm join 10.10.16.38:6443 --token yourtoken \
            --discovery-token-ca-cert-hash sha256:hashvalue
            
    #在master节点上查看k8s集群节点
    kubectl get nodes
    
    

3、安装网络插件(二选一)

  • 安装Calico网络插件

    #使用curl下周插件得yaml文件
    curl https://docs.projectcalico.org/manifests/calico.yaml -O
    
    #使用kubectl apply应用刚刚下载好的calico.yaml文件。
    kubectl apply -f calico.yaml
    
    #查看当前k8s集群得pods
    kubectl get pods -o wide -n kube-system
    
    
  • kube-flannel

    #下载yaml文件
    wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    #使用kubectl apply应用刚刚下载好的calico.yaml文件。
    kubectl apply -f kube-flannel.yml
    
    #查看当前k8s集群的pods(一个pod内运行了多个docker容器,-n表命名空间)
    kubectl get pods -o wide -n kube-system
    kubectl get pods  -n kube-system
    
    

此时查看集群节点状态:

[root@master ~]# kubectl get nodes
 NAME     STATUS      ROLES          AGE    VERSION
master   Ready    control-plane,master   141m   v1.21.2
node01   Ready    <none>                 124m   v1.21.2

到此为止环境搭建完成

4、命名空间namespace

#创建命名空间
kubectl create namespace karen

#查看命名空间
kubectl get namespace

三、部署容器化应用

  • 就是将一个程序放在docker里部署,这个docker应用就是容器化应用
  • 如在docker里面部署一个nginx,这个dockers+nginx一起就是一个容器化应用
  • 步骤:
    • 程序打包 —> 通过dockerfile文件生成docker镜像 —> k8s部署该镜像 —> 部署完成
    • 制作镜像 —> 通过控制管理pod —> 暴露应用以便外界访问

1. Nginx

#拉取镜像运行(运行成功后可到node节点查看到拉取的nginx镜像)
kubectl create deployment nginx01 --image=nginx

kubectl get pod            #查看pod
kubectl get deployment     #查看控制器
kubectl get service        #查看服务

#暴露端口,访问地址:http://NodeIp:Port
kubectl expose deployment nginx01 --port=80 --type=NodePort
#访问地址。30154为查看服务里查询到的端口地址
http://192.168.14.161:30154/

#后续操作(删除)
kubectl delete deployment nginx01      #删除控制器(删除后,控制器下对应的pod也会被删除)
kubectl delete pod nginx01-67fdf8d7c7-gllff    #查询对应pod名进行删除

你可能感兴趣的