kubernetes概述与入门

一.Kubernetes概述

 1.kubernetes是什么?

  • k8s是Google在2014年开源的一个容器集群管理系统,由于ks之间有8个字母,因此简称k8s
  • k8s用于容器化应用程序的部署,扩展和管理
  • k8s提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能
  • k8s目标是让部署容器化应用简单高效
  • 官方网站:https://kubernetes.io/

 2.kubernetes的特性

  • 自我修复:在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量,杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断
  • 弹性伸缩:使用命令,UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性,业务低峰时回收资源,以最小成本运行服务
  • 自动部署和回滚:k8s采用自动更新策略更新应用,一次更新一个pod,而不是同时删除所有pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务
  • 服务发现和负载均衡:k8s为多个容器提供一个统一访问入口,并且负载均衡关联所有容器,使得用户无需考虑容器IP问题
  • 机密和配置管理:管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性,并可以将一些常用的配置存储在k8s中,方便应用程序使用
  • 存储编排:挂载外部存储系统,无论是来自本地存储,公有云还是网络存储都作为集群资源的一部分使用,极大提高存储使用灵活性
  • 批处理:提供一次性任务,定时任务,满足批量数据处理和分析的场景

 3.kubernetes集群架构与组件

  k8s集群架构图:

  

   各个组件的核心概念如下:

  Master组件:Kube-apiserver、kube-controller-manager、kube-scheduler、etcd

  kube-apiserver:k8s的API,集群的统一入口,各组件的协调者,以RESTFUL API接口提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后在提交给Etcd存储

       Kube-controller-manager:处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的

  Kube-scheduler:根据调度算法为新创建的Pod选择一个Node节点,可以任意部署在同一个节点上,也可以部署在不同的节点上。

  etcd:分布式键值存储系统,用于保存集群状态数据,比如Pod/Service等对象信息

  Node组件:kubelet,kube-proxy,docker或rocket

  kubelet:kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器,pod挂载数据卷,下载secret,获取容器和节点状态等工作,kubelet将每个pod转换成一组容器

  kube-proxy:在Node节点实现pod网络代理,维护网络规则和四层负载均衡工作

  docker或rocket:容器引擎,运行容器

 4.kubernetes核心概念

  核心概念图:

  

 

   Pod:最小部署单元、一组容器的集合、一个Pod的容器共享网络命名空间、Pod是短暂的

  Controllers:

    ReolicaSet:确保预期的Pod副本数量

    Deployment:无状态应用部署

    StatefulSet:有状态应用部署

    DaemonSet:确保所有Node运行同一个Pod

    Job:一次性任务

    Cronjob:定时任务

    更高级层次对象,部署和管理Pod

  Service:防止Pod失联,定义一组Pod的访问策略

  Label:标签,附加到某个资源上,用于关联对象,查询和筛选

  Namespaces:命名空间,将对象逻辑上隔离

  Annotations:注释

二.Kubeadm快速部署K8s集群

 1.安装要求

  再开始安装之前,部署kubernetes集群机器需要满足一下几个条件

  • 一台或多台机器,操作系统Centos7.X-86_64,我这里以三台为例
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

  学习目标:

  • 在所有节点上安装Docker和Kubeadm
  • 部署Kubernetes Master
  • 部署容器网络插件
  • 部署Kubernetes Node,将节点加入Kubernetes集群中
  • 部署Dashboard页面,可视化查看kubernetes资源

 2.准备环境(所有节点操作)

  关闭防火墙加入开机自动关闭:$ systemctl stop firewalld $ systemctl disable firewalld

  关闭selinux:$ sed -i 's/enforcing/disabled/' /etc/selinux/config $ setenforce 0

  关闭swap:$ swapoff -a $ 临时 $ vim /etc/fstab $ 永久关闭swap:注释掉最后一行即可

  

 

   添加主机名和Ip对应关系:

  

 

   将桥接的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 

 3.所有节点安装Docker、kubeadm、kubelet

  安装docker(所有节点):wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo $ yum -y install docker-ce-18.06.1.ce-3.el7 $ systemctl enable docker && systemctl start docker

  

  添加阿里云YUM软件源:

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

  安装kubeadm,kubelet和kubectl:$ yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0 $ systemctl enable kubelet

 4.部署Kubenetes Master

  在主节点Master上执行:

  kubeadm init \
  --apiserver-advertise-address=192.168.31.61 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.15.0 \
  --service-cidr=10.1.0.0/16 \
  --pod-network-cidr=10.244.0.0/16

  使用kubectl工具:bash mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config $ kubectl get nodes

 5.部署Pod网络插件

  获取yaml文件:wget    https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

  如果下载失败,可以改成这个镜像地址:lizhenliang/flannel:v0.11.0-amd64,编辑修改制定源:

  

 

   随后执行kubectl命令生效:kubectl apply -f kube-flannel.yml

 6.加入Kubernetes Node

  在Node节点执行:向集群中添加新节点,执行在kubeadm init输出的kubeadm  join命令:

  类似这样的命令格式:$ kubeadm join 192.168.31.61:6443 --token esce21.q6hetwm8si29qxwn \ --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

 7.部署一个测试实例

  在Kubernetes集群中创建一个pod,验证是否正常运行:

  $ kubectl create deployment nginx --image=nginx $ kubectl expose deployment nginx --port=80 --type=NodePort $ kubectl get pod,svc

  访问地址:http://NodeIP:Port

 8.部署Web Ui(Dashboard)

  下载dashboard组件:wget   https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

  默认镜像国内无法访问,修改镜像地址为: lizhenliang/kubernetes-dashboard-amd64:v1.10.1

  默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

  编辑修改如下:

  

 

   

 

  $ kubectl apply -f kubernetes-dashboard.yaml 访问地址:http://NodeIP:30001

  创建service account并绑定默认cluster-admin管理员集群角色:

  $ kubectl create serviceaccount dashboard-admin -n kube-system $ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin $ kubectl describe secrets -n kube-system $(kubectl -n kube-  system get secret | awk '/dashboard-admin/{print $1}')

  使用输出的token登录Dashboard。

  注意:使用火狐浏览器登录。

 三.kubectl命令管理工具

 1.kubectl管理命令概要

  kubectl命令行一览表:

  

 2.kubectl管理应用程序生命周期 

  创建:

    kubectl  create deployment nginx --image=nginx:1.14

    kubectl get deploy,pods

  

   发布:

    kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service

    kubectl get service

  

   更新:

    kubectl set image deployment/nginx nginx=nginx:1.15

  

   回滚:

    kubectl rollout history deployment/nginx

       kubectl rollout undo deployment/nginx

  

   删除:

    kubectl delete deploy/nginx

    kubectl delete svc/nginx-service

  

 四.资源编排(YAML)

 1.YAML文件格式说明

  YAML是一种简洁的非标记语言

  语法格式:

  • 缩进表示层级关系
  • 不支持制表符“tab”缩进,使用空格缩进
  • 通常开头缩进2个空格
  • 字符后缩进一个空格,如冒号、逗号等
  • “---”表示YAML格式,一个文件的开始
  • “#”表注释

 2.YAML文件创建资源对象

  

 

   

 

   为容器创建service:

  

 

   

 3.资源字段太多,记不住?

  • 用run命令生成:kubectl create deployment nginx --image=nginx:1.14 -o yaml --dry-run > my-deploy.yaml
  • 用get命令导出:kubectl get my-deploy/nginx -o=yaml --export > my-deploy.yaml
  • kubectl explain pods.spec.containers

 

posted @ 2019-09-05 17:11  淋汐去水  阅读(559)  评论(0编辑  收藏  举报