k8s 时不我待 只争朝夕
什么是k8s kubernetes
Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.
开源的系统 他可以自动部署 估量 管理容器应用;容器编排引擎。
容器编排:应用一般是单独容器化的组件(微服务化)组成,按照顺序在网络级别进行组织,以使其按照计划运行。以这种形式对容器进行组织的流程就叫做容器编排。
容器编排是指对单独组件和应用层的工作进行组织的流程。
业界的容器编排引擎的事实标准----k8s
Google的一个开源项目
为什么要学习k8s
挑战与机会并存 难得的提升自我的机会
先跑起来:
建立感性认识 快速了解概念
创建k8s集群
$ minikube version #
minikube version: v1.3.0
commit: 43969594266d77b555a207b0f3e9b3fa1dc92b1f
$ minikube start
* minikube v1.3.0 on Ubuntu 18.04
* Running on localhost (CPUs=2, Memory=2461MB, Disk=47990MB) ...
* OS release is Ubuntu 18.04.2 LTS
* Preparing Kubernetes v1.15.0 on Docker 18.09.5 ...
- kubelet.resolv-conf=/run/systemd/resolve/resolv.conf
* Pulling images ...
* Launching Kubernetes ...
* Waiting for: apiserver proxy etcd scheduler controller dns
* Done! kubectl is now configured to use "minikube"
$ kubectl get nodes #node是deploy我们app的地方
NAME STATUS ROLES AGE VERSION
minikube Ready master 4m8s v1.15.0
$ hostname
minikube
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.10:8443
KubeDNS is running at https://172.17.0.10:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.2", GitCommit:"f6278300bebbb750328ac16ee6dd3aa7d3549568", GitTreeState:"clean", BuildDate:"2019-08-05T09:23:26Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:32:14Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
部署应用
概念:
cluster:计算、存储、网络资源的集合 k8s利用这些资源运行各种基于容器的应用
master:cluser的大脑 主要职责是调度 决定应用放在哪里运行
node:运行应用 node是由master管理 监控并汇报容器的状态 根据master的要求管理容器的生命周期
node和master可以是一台机器 一台机器可以有多种角色
pod:是k8s的最小工作单元 pod包含一个多个容器 这些容器作为一个整体被master调度到另外一个node
为什么k8s引入pod概念?
1.可管理性 有些容器天生需要紧密关联,以pod为最小单位进行调度 扩展 共享资源 管理生命周期
2.通信和资源共享 相同的namespace 可以用localhost通信 可以共享存储;挂载vol到pod 本质是挂载vol到pod的每一个容器
pod的使用方式:
1.运行单一容器 one-container-per-pod包含一个多个容器
2.运行多个容器 :关系必须特别紧密 而且需要共享资源 这种情况可以放到一个pod中;tomcat和mysql就不符合这种情况 备注:他们需要协作但是不至于放到一个pod中 他们通过jdbc交互
controller:k8s不直接创建pod 而是通过controller来管理pod的 controller定义了pod的部署特性 比如几个副本 在什么node运行 包括deployment/replicaSet/DaemonSet/StatefuleSet/job等
deployment:最常用 可以管理pod的副本
replicaSet:deployment其实是通过replicaSet来管理副本的 一般不直接使用它
daemonSet:每个node最多运行一个pod副本
statefuleSet:保证pod每个副本在生命周期中名称不变
job:运行结束就删除的应用 其他controller的pod通常长期持续运行
Service:定义了外界访问一组特定pod的方式 service有自己的ip和端口 为pod提供了负载均衡、
controller是运行pod的 访问是service来执行的
namespace:为了资源隔离 默认有default和kubesystem2个namespace
部署kubernetes cluster
环境准备:192.168.135.50/51/52 分别是master node01 node02 自备梯子
安装:
sudo apt-get update && apt-get install docker.io #安装docker
添加apt-get源 # 略
sudo apt-get install -y kubelet kubeadm kubectl
创建:
master:kubeadm init --apiserver-advertise-address 192.168.135.50 --pod-network-cidr=10.244.0.0/16 ##--pod-network-cidr指定pod网络的范围
master:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
node01:kubeadm join 192.168.135.50:6443 --token 5ni7kd.nvq2s89ul2dfp0nx --discovery-token-ca-cert-hash sha256:dfb4b8c08e184dcd1003cb487fd482d3e3258f82ed1084a6f29404f43871879b --ignore-preflight-errors=all
node02:kubeadm join 192.168.135.50:6443 --token 5ni7kd.nvq2s89ul2dfp0nx --discovery-token-ca-cert-hash sha256:dfb4b8c08e184dcd1003cb487fd482d3e3258f82ed1084a6f29404f43871879b --ignore-preflight-errors=all
查看node:
wyp@k8s-master:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 4d2h v1.15.2
k8s-node01 Ready <none> 3d19h v1.15.2
k8s-node02 Ready <none> 3d19h v1.15.2
查看pod:
wyp@k8s-master:~$ kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default http-app-c5f548d75-77dtx 1/1 Running 0 3d19h 10.244.1.2 k8s-node01 <none> <none>
default http-app-c5f548d75-xsc24 1/1 Running 0 3d19h 10.244.2.5 k8s-node02 <none> <none>
kube-system coredns-5c98db65d4-m5bg8 1/1 Running 1152 4d2h 10.244.0.8 k8s-master <none> <none>
kube-system coredns-5c98db65d4-sxfcr 1/1 Running 1153 4d2h 10.244.0.9 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-8gtss 1/1 Running 3 3d19h 192.168.135.52 k8s-node02 <none> <none>
kube-system kube-flannel-ds-amd64-cpk2c 1/1 Running 1 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-tz6h2 1/1 Running 0 3d19h 192.168.135.51 k8s-node01 <none> <none>
kube-system kube-proxy-m4x8z 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-proxy-mklr6 1/1 Running 0 3d19h 192.168.135.52 k8s-node02 <none> <none>
kube-system kube-proxy-zmg7g 1/1 Running 0 3d19h 192.168.135.51 k8s-node01 <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 3 4d2h 192.168.135.50 k8s-master <none> <none>
查看单个pod详情:
wyp@k8s-master:~$ kubectl describe pod http-app-c5f548d75-xsc24
Name: http-app-c5f548d75-xsc24
Namespace: default
Priority: 0
Node: k8s-node02/192.168.135.52
Start Time: Thu, 15 Aug 2019 15:56:53 +0800
Labels: pod-template-hash=c5f548d75
run=http-app
Annotations: <none>
Status: Running
IP: 10.244.2.5
Controlled By: ReplicaSet/http-app-c5f548d75
Containers:
http-app:
Container ID: docker://3dac0ec332c121ceb8af2307a43eefefaad242d3e5cbfbe55c80aa7b9c49e9d8
Image: httpd
Image ID: docker-pullable://httpd@sha256:7f24d65cdf99ceeeaa70a04ec920ea12edba06e0d2eb3f778d289faa76d15e17
Port: <none>
Host Port: <none>
State: Running
Started: Thu, 15 Aug 2019 16:36:11 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-4knzs (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-4knzs:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-4knzs
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: <none>
4.k8s架构:
由master和node组成,节点上运行着k8s的服务
4.1master节点
master:cluster的大脑
kube-apiserver:前端接口 cli或者gui以及其他组件通过它管理cluster的资源
kube-scheduler: schedule负责决定将pod放在哪个node上运行
kube-controller:负责管理cluster的资源 保证资源处于预期的状态
etcd:保存cluster的配置信息和资源的状态信息 当数据变化时 etcd会通知相关的组件
pod网络,例如flannel /ˈflæn.əl/ pod间通信必要的
4.2node节点
node是pod运行的地方
node上有kubelet kube-proxy pod网络
kubelet是node的agent
kube-prox在逻辑上代表了后端的pod,外界先访问service 然后通过kube-proxy转发到pod
4.3架构图
wyp@k8s-master:~$ kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default http-app-c5f548d75-77dtx 1/1 Running 0 3d19h 10.244.1.2 k8s-node01 <none> <none>
default http-app-c5f548d75-xsc24 1/1 Running 0 3d19h 10.244.2.5 k8s-node02 <none> <none>
kube-system coredns-5c98db65d4-m5bg8 1/1 Running 1152 4d2h 10.244.0.8 k8s-master <none> <none>
kube-system coredns-5c98db65d4-sxfcr 1/1 Running 1153 4d2h 10.244.0.9 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-8gtss 1/1 Running 3 3d19h 192.168.135.52 k8s-node02 <none> <none>
kube-system kube-flannel-ds-amd64-cpk2c 1/1 Running 1 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-flannel-ds-amd64-tz6h2 1/1 Running 0 3d19h 192.168.135.51 k8s-node01 <none> <none>
kube-system kube-proxy-m4x8z 1/1 Running 2 4d2h 192.168.135.50 k8s-master <none> <none>
kube-system kube-proxy-mklr6 1/1 Running 0 3d19h 192.168.135.52 k8s-node02 <none> <none>
kube-system kube-proxy-zmg7g 1/1 Running 0 3d19h 192.168.135.51 k8s-node01 <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 3 4d2h 192.168.135.50 k8s-master <none> <none>
4.4用一个例子串起来
wyp@k8s-master:~$ kubectl run http-app --image=httpd --replicas=2 #创建一个deployment
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
Error from server (AlreadyExists): deployments.apps "http-app" already exists
wyp@k8s-master:~$ kubectl get deployment #查看deployment
NAME READY UP-TO-DATE AVAILABLE AGE
http-app 2/2 2 2 3d21h
wyp@k8s-master:~$ kubectl get pod -o wide #查看pod
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
http-app-c5f548d75-77dtx 1/1 Running 0 3d21h 10.244.1.2 k8s-node01 <none> <none>
http-app-c5f548d75-xsc24 1/1 Running 0 3d21h 10.244.2.5 k8s-node02 <none> <none>
kubect发送命令到kube-apiserver-k8s-master,kube-controller-manager-k8s-master接收到通知创建deployment资源,kube-scheduler-k8s-master 执行调度任务,将副本分发到node01和02,
node节点的kubelet接收到任务 分别在各自节点创建并运行pod