Kubernetes --(k8s)入门

k8s 简介:

什么是k8s?html

Kubernetes (k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整的功能,提升了大规模容器集群管理的便捷性。node

Kubernetes的优点:linux

  • 容器编排
  • 轻量级
  • 开源
  • 弹性伸缩
  • 负载均衡

相关网站:

Kubernetes (k8s) 官网:https://kubernetes.io/
Kubernetes (k8s) 官方文档:https://kubernetes.io/docs/home/
Kubernetes(k8s)中文文档:https://www.kubernetes.org.cn/k8snginx

Kubernetes (k8s )核心组件

  1. etcd etcd是一个高可用的键值存储系统,K8s使用它来存储各个资源的状态,从而实现了Restful的API;
  2. api server 提供了资源操做的惟一入口,并提供认证、受权、访问控制、API注册和发现等机制;
  3. controller manager 负责维护集群的状态,好比故障检测、自动扩展、滚动更新等;
  4. scheduler 负责资源的调度,按照预约的调度策略将Pod调度到相应的机器上;
  5. kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  6. Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);
  7. kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;

master与node节点服务:

  • Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd
  • Node节点主要由三个模块组成:kubelet、kube-proxy、runtime

  • coredns 负责为整个集群提供DNS服务
  • flanneld 负责为整个集群提供网络服务


pod建立过程

kubernetes之pod生命周期:https://www.kubernetes.org.cn/5335.htmlgit


k8s中的名词概念

cluster

cluster 是计算、存储、网络资源的集合,k8s利用这些资源运行各类基于容器的应用github

master

master 是cluster的大脑,他的主要职责是调度,即决定将应用放在哪里运行。master运行linux操做系统,能够是物理机或者虚拟机。为了高可用,能够运行多个masterdocker

node

node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linuxjson

pod

pod是k8s最小工做单元.Pod是最小的,管理,建立,计划的最小单元,每一个pod包含一个或多个容器;pod中的容器会做为一个总体被master调度到一个node上运行vim

controller

k8s一般不会直接建立pod,而是经过controller来管理pod的;controller中定义了pod的部署特性,好比有几个剧本,在什么样的node上运行等。为了知足不一样的业务场景,k8s提供了多种controller ,包括:deployment 、replicaset、daemonset 、job 等centos

deployment

Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法。使用Deployment来建立ReplicaSet;ReplicaSet在后台建立pod。

  • 定义Deployment来建立Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

replicaset

Deployment建立ReplicaSet;ReplicaSet在后台建立pod.replicaset实现了pod的多副本管理。使用deployment时会自动建立replicaset,也就是说deployment是经过replicaset来管理pod的多个副本的,咱们一般不须要直接使用replicaset

保证了在全部时间内,都有特定数量的Pod副本正在运行,若是太多了,Replication Controller就杀死几个,若是太少了,Replication Controller会新建几个,和直接建立的pod不一样的是,Replication Controller会替换掉那些删除的或者被终止的pod,无论删除的缘由是什么(维护阿,更新啊,Replication Controller都不关心)

daemonset

DaemonSet保证在每一个Node上都运行一个容器副本,经常使用来部署一些集群的日志、监控或者其余系统管理应用,

  • 日志收集,好比fluentd,logstash等
  • 系统监控,好比Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系统程序,好比kube-proxy, kube-dns, glusterd, ceph等

StatefulSet

稳定的持久化存储;可以保证pod的每一个副本在整个生命周期中名称是不变的;当某个pod发生故障须要删除并从新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除
详解网址:https://www.kubernetes.org.cn/statefulset

job

Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

CronJob

CronJob即定时任务,就相似于Linux系统的crontab,在指定的时间周期运行指定的任务。在Kubernetes 1.5,使用CronJob须要开启batch/v2alpha1 API,即–runtime-config=batch/v2alpha1
https://www.kubernetes.org.cn/cronjob

service

https://www.kubernetes.org.cn/kubernetes-services
http://www.javashuo.com/article/p-pyxnexwv-kp.html

namespace

能够将一个物理的cluster逻辑上划分红多个虚拟cluster,每一个cluster就是一个namespace。不一样的namespace里的资源是彻底隔离的


部署k8s集群

实验集群环境

node1 : IP=192.168.137.3 ;MEM-->2G ;CPU-->2核 ;关闭交换分区 master
node2 : IP=192.168.137.4 ;MEM-->2G ;CPU-->2核 ;关闭交换分区 node
node3 : IP=192.168.137.5 ;MEM-->2G ;CPU-->2核 ;关闭交换分区 node

全部节点的操做

第一步:主机名解析

╭─root@node* ~  
╰─➤  vim /etc/hosts  
...
192.168.137.3 node1
192.168.137.4 node2
192.168.137.5 node3

第二步:禁用交换分区

╭─root@node* ~  
╰─➤  swapoff -a
╭─root@node* ~  
╰─➤  vim /etc/fstab
...
#/dev/mapper/cl-swap     swap                    swap    defaults        0 0
...
╭─root@node* ~  
╰─➤  free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        821M        204M         50M        797M        738M
Swap:            0B          0B          0B

第三步:安装docker

╭─root@node* ~  
╰─➤  cat docker-sbeed.sh 
#!/bin/bash
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
mv docker-ce.repo /etc/yum.repos.d
yum install docker-ce -y

# aliyun 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://*****.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

╭─root@node* ~  
╰─➤  bash docker-sbeed.sh

第四步:要保证打开内置的桥功能,这个是借助于iptables来实现的

╭─root@node2 ~  
╰─➤  echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables 

# 须要安装docker才会成/proc/sys/net/bridge/bridge-nf-call-iptables

第五步:准备k8s安装源

╭─root@node* ~  
╰─➤  vim /etc/yum.repos.d/k8s.repo  

[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

第六步:下载程序包

╭─root@node* ~  
╰─➤  yum install kubelet kubectl kubeadm -y 

# kubelet 实现pod建立
# kubeadm 集群初始化
# kubectl 命令行工做

第七步:kubelet开机自启

╭─root@node* ~  
╰─➤  systemctl enable kubelet

master节点运行命令

第一步:初始化master

╭─root@node1 ~  
╰─➤  kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.2 --apiserver-advertise-address 192.168.137.3 --pod-network-cidr=10.244.0.0/16


# # –image-repository string:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,咱们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers

# # –kubernetes-version string:指定kubenets版本号,默认值是stable-1,会致使从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,咱们能够将其指定为固定版本(v1.15.1)来跳过网络请求。

# # –apiserver-advertise-address 指明用 Master 的哪一个 interface 与 Cluster 的其余节点通讯。若是 Master 有多个 interface,建议明确指定,若是不指定,kubeadm 会自动选择有默认网关的 interface。

# # –pod-network-cidr指定 Pod 网络的范围。Kubernetes 支持多种网络方案,并且不一样网络方案对  –pod-network-cidr有本身的要求,这里设置为10.244.0.0/16 是由于咱们将使用 flannel 网络方案,必须设置成这个 CIDR。

若是初始化失败,请使用以下代码清除后从新初始化

kubeadm reset
 ifconfig cni0 down
 ip link delete cni0
 ifconfig flannel.1 down
 ip link delete flannel.1
 rm -rf /var/lib/cni/
 rm -rf /var/lib/etcd/*

第二步:配置kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config


# kubectl 是管理 Kubernetes Cluster 的命令行工具,前面咱们已经在全部的节点安装了 kubectl。Master 初始化完成后须要作一些配置工做,而后 kubectl 就能使用了

为了使用更便捷,启用 kubectl 命令的自动补全功能

╭─root@node1 ~  
╰─➤  echo "source <(kubectl completion bash)" >> ~/.bashrc

第三步:安装pod网络

╭─root@node1 ~  
╰─➤  kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 要让 Kubernetes Cluster 可以工做,必须安装 Pod 网络,不然 Pod 之间没法通讯。
# Kubernetes 支持多种网络方案,这里咱们先使用 flannel

为k8s添加节点

node 节点操做

╭─root@node2 ~  
╰─➤  kubeadm join 192.168.137.3:6443 --token 1lxhha.rvtg5i1n53vm9hs1 \
    --discovery-token-ca-cert-hash sha256:0b5ce146f98a5efcfddda3637374de1e62d69e10f1b9e37e792e0ac555422039

#  经过kubeadm初始化后,都会提供node加入的token (在初始化的最后一行输出)
#  node 节点加入运行此命令便可
#  rm -rf /etc/kubernetes/*     从新添加节点需删除上次添加节点时生成的文件

token过时了怎么办

  1. 经过kubeadm初始化后,都会提供node加入的token
  2. 默认token的有效期为24小时,当过时以后,该token就不可用了

第一步:在master节点上从新生成token

╭─root@node1 ~  
╰─➤  kubeadm token create 
zlbwtm.1mtft6bb9k7a2108

第二步:在master节点上获取证书sha256 编码hash值

╭─root@node1 ~  
╰─➤  openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

0b5ce146f98a5efcfddda3637374de1e62d69e10f1b9e37e792e0ac555422039

第三步:在node节点上节点加入集群

╭─root@node3 ~  
╰─➤  kubeadm join 192.168.137.3:6443 --token zlbwtm.1mtft6bb9k7a2108
 --discovery-token-ca-cert-hash sha256:0b5ce146f98a5efcfddda3637374d
e1e62d69e10f1b9e37e792e0ac555422039

k8s集群建立pods

第一步:建立nginx pod

╭─root@node1 ~  
╰─➤  kubectl run nginx --image=nginx -r 2

# -r  指定建立的pod数量

第二步:查看pod (详细)

╭─root@node1 ~  
╰─➤  kubectl get pod -o wide
NAME                     READY   STATUS              RESTARTS   AGE     IP       NODE    NOMINATED NODE   READINESS GATES
nginx-7bb7cd8db5-d2qf2   0/1     ContainerCreating   0          5m56s   <none>   node2   <none>           <none>
nginx-7bb7cd8db5-sr7qt   0/1     ContainerCreating   0          5m56s   <none>   node3   <none>           <none>

第三步:查看deployment

# kubectl api-resources   查看缩写

╭─root@node1 ~  
╰─➤  kubectl get deploy     
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/2     2            0           15m


# READY 2/2 第一个2是已经启动的pod数,第二个2是须要总共启动的pod数量
# UP-TO-DATE  须要的数量
# AVAILABLE 可用的数量

分析建立过程

  1. kubectl 经过api-server建立nginx deployment
  2. deployment-manager 建立nginx deployment
  3. scheduler把两个pod调度到不一样的节点之上
  4. 节点之上的kubelet建立两个pod

k8s集群deployment

第一步:查看当前deployment

╭─root@node1 ~  
╰─➤  kubectl get deploy     
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/2     2            0           15m

第二步:查看当前deployment详细信息

╭─root@node1 ~  
╰─➤  kubectl describe deploy nginx
Name:                   nginx
Namespace:              default
CreationTimestamp:      Tue, 20 Aug 2019 03:43:44 -0400
Labels:                 run=nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=nginx
Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-7bb7cd8db5 (2/2 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  56m   deployment-controller  Scaled up replica set nginx-7bb7cd8db5 to 2

第三步:查看replicaset

╭─root@node1 ~  
╰─➤  kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-7bb7cd8db5   2         2         2       58m

第四步:查看replicaset详细信息

╭─root@node1 ~  
╰─➤  kubectl describe rs nginx-7bb7cd8db5
Name:           nginx-7bb7cd8db5
Namespace:      default
Selector:       pod-template-hash=7bb7cd8db5,run=nginx
Labels:         pod-template-hash=7bb7cd8db5
                run=nginx
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/nginx      # replicaset 被deployment管理
Replicas:       2 current / 2 desired
Pods Status:    2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  pod-template-hash=7bb7cd8db5
           run=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  60m   replicaset-controller  Created pod: nginx-7bb7cd8db5-sr7qt
  Normal  SuccessfulCreate  60m   replicaset-controller  Created pod: nginx-7bb7cd8db5-d2qf2

第五步:查看pod详细信息

╭─root@node1 ~  
╰─➤  kubectl get po
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7bb7cd8db5-d2qf2   1/1     Running   0          62m
nginx-7bb7cd8db5-sr7qt   1/1     Running   0          62m

╭─root@node1 ~  
╰─➤  kubectl describe  pod nginx-7bb7cd8db5-d2qf2         
Name:           nginx-7bb7cd8db5-d2qf2
Namespace:      default
Priority:       0
Node:           node2/192.168.137.4
Start Time:     Tue, 20 Aug 2019 03:43:46 -0400
Labels:         pod-template-hash=7bb7cd8db5
                run=nginx
Annotations:    <none>
Status:         Running
IP:             10.244.1.2
Controlled By:  ReplicaSet/nginx-7bb7cd8db5
Containers:
  nginx:
    Container ID:   docker://67466adb9736a6d86f12513f589fa50c47003b7f37ca1abb0155a39b37064d0c
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Tue, 20 Aug 2019 04:02:04 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-ngn4n (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-ngn4n:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-ngn4n
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason   Age   From            Message
  ----    ------   ----  ----            -------
  Normal  Pulled   45m   kubelet, node2  Successfully pulled image "nginx"
  Normal  Created  45m   kubelet, node2  Created container nginx
  Normal  Started  45m   kubelet, node2  Started container nginx

第六步:监测pod日志

╭─root@node1 ~  
╰─➤  kubectl logs -f  nginx-7bb7cd8db5-d2qf2

相关文章
相关标签/搜索