什么是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
- etcd etcd是一个高可用的键值存储系统,K8s使用它来存储各个资源的状态,从而实现了Restful的API;
- api server 提供了资源操做的惟一入口,并提供认证、受权、访问控制、API注册和发现等机制;
- controller manager 负责维护集群的状态,好比故障检测、自动扩展、滚动更新等;
- scheduler 负责资源的调度,按照预约的调度策略将Pod调度到相应的机器上;
- kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;
- Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd
- Node节点主要由三个模块组成:kubelet、kube-proxy、runtime
- coredns 负责为整个集群提供DNS服务
- flanneld 负责为整个集群提供网络服务
kubernetes之pod生命周期:https://www.kubernetes.org.cn/5335.htmlgit
cluster 是计算、存储、网络资源的集合,k8s利用这些资源运行各类基于容器的应用github
master 是cluster的大脑,他的主要职责是调度,即决定将应用放在哪里运行。master运行linux操做系统,能够是物理机或者虚拟机。为了高可用,能够运行多个masterdocker
node的职责是运行容器应用。node由master管理,node负责监控并汇报容器的状态,同时根据master的要求管理容器的生命周期。node运行在linuxjson
pod是k8s最小工做单元.Pod是最小的,管理,建立,计划的最小单元,每一个pod包含一个或多个容器;pod中的容器会做为一个总体被master调度到一个node上运行vim
k8s一般不会直接建立pod,而是经过controller来管理pod的;controller中定义了pod的部署特性,好比有几个剧本,在什么样的node上运行等。为了知足不一样的业务场景,k8s提供了多种controller ,包括:deployment 、replicaset、daemonset 、job 等centos
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法。使用Deployment来建立ReplicaSet;ReplicaSet在后台建立pod。
- 定义Deployment来建立Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment
Deployment建立ReplicaSet;ReplicaSet在后台建立pod.replicaset实现了pod的多副本管理。使用deployment时会自动建立replicaset,也就是说deployment是经过replicaset来管理pod的多个副本的,咱们一般不须要直接使用replicaset
保证了在全部时间内,都有特定数量的Pod副本正在运行,若是太多了,Replication Controller就杀死几个,若是太少了,Replication Controller会新建几个,和直接建立的pod不一样的是,Replication Controller会替换掉那些删除的或者被终止的pod,无论删除的缘由是什么(维护阿,更新啊,Replication Controller都不关心)
DaemonSet保证在每一个Node上都运行一个容器副本,经常使用来部署一些集群的日志、监控或者其余系统管理应用,
- 日志收集,好比fluentd,logstash等
- 系统监控,好比Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
- 系统程序,好比kube-proxy, kube-dns, glusterd, ceph等
稳定的持久化存储;可以保证pod的每一个副本在整个生命周期中名称是不变的;当某个pod发生故障须要删除并从新启动时,pod的名称会发生变化,同时statefulset会保证副本按照固定的顺序启动、更新或者删除
详解网址:https://www.kubernetes.org.cn/statefulset
Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
CronJob即定时任务,就相似于Linux系统的crontab,在指定的时间周期运行指定的任务。在Kubernetes 1.5,使用CronJob须要开启batch/v2alpha1 API,即–runtime-config=batch/v2alpha1
https://www.kubernetes.org.cn/cronjob
https://www.kubernetes.org.cn/kubernetes-services
http://www.javashuo.com/article/p-pyxnexwv-kp.html
能够将一个物理的cluster逻辑上划分红多个虚拟cluster,每一个cluster就是一个namespace。不一样的namespace里的资源是彻底隔离的
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
╭─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
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/* 从新添加节点需删除上次添加节点时生成的文件
- 经过kubeadm初始化后,都会提供node加入的token
- 默认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
第一步:建立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 可用的数量
- kubectl 经过api-server建立nginx deployment
- deployment-manager 建立nginx deployment
- scheduler把两个pod调度到不一样的节点之上
- 节点之上的kubelet建立两个pod
第一步:查看当前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