k8s 简介:

什么是k8s?

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

Kubernetes的优势:

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

相关网站:

Kubernetes (k8s) 官网:https://kubernetes.io/

Kubernetes (k8s) 官方文档:https://kubernetes.io/docs/home/

Kubernetes(k8s)中文文档:https://www.kubernetes.org.cn/k8s

Kubernetes (k8s) 中文社区:https://www.kubernetes.org.cn/tags/cncf

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.html


k8s中的名词概念

cluster

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

master

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

node

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

pod

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

controller

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

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

https://www.cnblogs.com/du-z/p/11388805.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

Kubernetes --(k8s)入门的更多相关文章

  1. K8s / Kubernetes 从入门到入门

    Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是k ...

  2. k8s入门系列之guestbook快速部署

    k8s集群以及一些扩展插件已经安装完毕,本篇文章介绍一下如何在k8s集群上快速部署guestbook应用. •实验环境为集群:master(1)+node(4),详细内容参考<k8s入门系列之集 ...

  3. k8s入门系列之扩展组件(一)DNS安装篇

    DNS (domain name system),提供域名解析服务,解决了难于记忆的IP地址问题,以更人性可读可记忆可标识的方式映射对应IP地址. Cluster DNS扩展插件用于支持k8s集群系统 ...

  4. k8s入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  5. K8s 入门

    中文文档:https://www.kubernetes.org.cn/kubernetes%E8%AE%BE%E8%AE%A1%E6%9E%B6%E6%9E%84 小结大白话 Portainer 挺好 ...

  6. k8s 入门系列之集群安装篇

    关于kubernetes组件的详解介绍,请阅读上一篇文章<k8s入门系列之介绍篇> Kubernetes集群安装部署 •Kubernetes集群组件: - etcd 一个高可用的K/V键值 ...

  7. Kubernetes快速入门

    二.Kubernetes快速入门 (1)Kubernetes集群的部署方法及部署要点 (2)部署Kubernetes分布式集群 (3)kubectl使用基础 1.简介 kubectl就是API ser ...

  8. 反手来个K8S入门到跑路

    layout: post title: 反手来个K8S入门到跑路 category: linux date: 2019-06-09 tags: linux k8s 反手来个K8S入门到跑路 前言 放假 ...

  9. ASP.NET Core on K8S 入门学习系列文章目录

    一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...

  10. k8s入门你至少需要会哪些

    body { margin: 0; overflow: auto; font: normal 14px Verdana; background: rgba(255, 255, 255, 1); pad ...

随机推荐

  1. 伯俊BOS2.0关于订金单的处理方案

    订金单功能调整设计 一.     功能确认 BPOS关于订金的使用对应的是"预收单",原"预收单"设置有商品明细,根据客户对订金的需求,取消原有"商品 ...

  2. c#中io常用操作笔记

    创建文件1 private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == string.Empty) { ...

  3. 使用docker制作Mysql镜像

     一.过程说明 通过Dockerfile创建mysql镜像,使用的mysql软件包为mariadb二进制分发版,最终在宿主机启动mysql容器从而能在mysql容器外部访问mysql服务. 宿主机IP ...

  4. hive优化之小文件合并

    文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...

  5. vue 过滤器 filter 的使用

    1.局部过滤器的使用 比如性别,订单状态的数据,后端一般返回数字来代替状态.以性别为模拟数据,0是未知,1是男,2是女. 直接数据渲染出来,只有012,没有性别 根据后端返回的int类型值,前端对数据 ...

  6. #3使用html+css+js制作网页 番外篇 制作接收php

    使用html+css+js制作网页 番外篇 制作接收php 本系列链接 基础 php语法 例子 本系列链接 #1使用html+css+js制作网站教程 准备 #2使用html+css+js制作网站教程 ...

  7. 计算机考研复试真题 abc

    题目描述 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的所有a.b.c的值. 输入描述: 题目没有任何输入. 输出描述: 请输出所有满足题目条 ...

  8. Java并发编程实战(5)- 线程生命周期

    在这篇文章中,我们来聊一下线程的生命周期. 目录 概述 操作系统中的线程生命周期 Java中的线程生命周期 Java线程状态转换 运行状态和阻塞状态之间的转换 运行状态和无时限等待状态的切换 运行状态 ...

  9. self-taught CS resouce recommendation

    https://github.com/keithnull/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md#%E8%AE%A1%E7%AE%97 ...

  10. 【MySQL】SELECT语句 - 查询数据

    第4章 检索数据 文章目录 第4章 检索数据 1.SELECT语句 2.检索单个列 3.检索多个列 4.检索所有列 5.检索不同的行 6.限制结果 7.使用完全限定的表名 8.小结 简单记录 - My ...