40.0 kubernetes初识

kubernetes基础
大纲

基础概念
集群部署及陈述式命令管理

资源类型及配置清单
Pod资源
Pod控制器
Service资源
存储卷
ConfigMap与Secret资源
StatefulSet控制器

认证、授权及准入控制
网络模型及网络策略
Pod资源调度
CRD、自定义资源、自定义控制器及自定义API server
资源指标与HPA控制器
Helm管理器
高可用Kubernetes

Linux Kernel
名称空间:PID,Mount,Network,UTS(主机名和域名),IPC过程间通信(Internet Process Connection),User,ControlGroups(资源分配)

容器是由linux内核提供的,是内核的一种特性,本来的一个用户空间被扩展为多个用户空间,每个空间都是行之有效的单独运行环境,就像单独使用一个内核,而内核把有限的资源分隔给每个用户空间使用,每个用户空间可以拿来当做一个完整的用户空间,或者只运行一个程序(docker);父进程创建子进程,回收子进程,若子进程未回收,而子父进程结束,此时,子进程成为孤儿进程,回收不回来了,占用资源;而在linux中,init进程是总的父进程,负责所有的子进程管理;这样,一个用户空间若有两个进程,还需要第三个进程来管理可能产生的孤儿进程;一个容器运行一个进程,只有一个进程,此进程崩溃,docker的编排工具k8s会自动迁移;实现可高用,动态扩展,快速创建

程序员如果开发一个程序,需要windows10版,macos版,linux版,unix版等,需要多个版本,多个环境,人力,物力高,而如果程序员面向容器开发,容器运行此程序,只要windows10,macos,linux,unix等支持容器,则只需要开发一种程序(面向容器),而把具体的底层工作都交给容器实现,由容器提供统一标准的接口;这样就可以一次开发,到处运行了;但容器太过底层,需要开发一种统一的工具以便使用

Docker最早采用LXC技术(LinuX Container的简写,LXC是Linux 原生支持的容器技术,可以提供轻量级的虚拟化,可以说 docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,发展标准的配置方法),而虚拟化技术KVM(Kernel-based Virtual Machine) 基于模块实现,Docker后改为自己研发并开源的runc技术运行容器。docker即是容器的简单实用的一种外壳

当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,这个时候推荐使用docker 单机编排工具docker compose,Docker Compose 是docker容器的一种编排服务,docker compose是一个管理多个容器的工具,比如可以解决容器之间的依赖关系,就像启动一个web就必须得先把数据库服务先启动一样,docker compose 完全可以替代docker run启动容器

容器化应用docker的镜像(可以把镜像看做一个模板,由此摸版创建容器),可以通过环境变量来实现不同配置的同一个应用程序,或者通过脚本;配置文件更改,容器会动态加载;通过一个镜像,多个配置文件实现多个环境如开发环境,测试环境,生成环境;如果把配置放在一个配置中心,放在单独的一个服务器,通过一个外壳把不同环境的配置文件注入到镜像当中,docker没有解决,此类容器编排由k8s实现,是一个抽象的外壳,可以实现多个主机节点上的多个容器之间的通信,容器集群等问题;

容器编排
Docker通过“镜像”机制极富创造性地解决了应用程序打包的根本性难题,它推动了容器技术的快速普及及生成应用
容器本身仅提供了托管应用的底层逻辑,而容器编排(Orchestration)才是真正产生价值的位置所在;
容器编排是一个软件,用来控制容器的创建,部署,动态伸缩,容器之间实时迁移,容器暴露服务以提供外部访问,容器的健康性检测,容器的服务发现实现Load balance,管理容器的生命周期管理,容器的Zero-downtime deploys, 存储管理

容器编排系统
kubernetes:服务即平台 PAAS,软件逻辑实现一系列复杂的功能;Kubernetes is an open-source platform for automating deployments,scaling,and operations of application containers across clusters of hosts,providing container-centric infranstructure.
Docker Swarm
Apache Mesos and Marathon

kubernetes的最小调度单元是pod,pod里面可以存在多个容器,每个容器运行一个程序且pod里的容器共享linux的内核6个名称空间

kubernetes是容器编排工具,容器的管理还需要靠容器管理工具,如docker,

Kubernetes Components

Master Components
	kube-apiserver
	etcd
	kube-scheduler
	kube-controller-manager
	cloud-controller-manager
Node Components
	kubelet
	kube-proxy       对pod的固定访问和动态创建和注册
	Container Runtime
Addons               附加节点,可以提供更加完善的功能
	DNS
	Web UI(Dashboard)
	Contrainer Resource Monitoring
	Cluster-level Logging  (EFK(Fluented,Elastic Search,kibana))

图共6个,此处是图3-9-26
40.0 kubernetes初识_第1张图片
Kubernetes系统的基本工作逻辑
  Kubernetes把应用程序及其周边概念抽象为资源类型,并通过属性赋值的方式实例化为对象,例如Pod资源类型及实例化的各Pod对象等;
  用户通过API server提交对象管理请求;请求创建的Pod对象由调度器调度至最佳匹配的Node上,并有kubelet创建和维护;
  Kubernetes把施加于资源对象智商的运维操作过程程序化为控制器,例如部署、健康状态监控、版本更新等,并由控制器通过“和解循环(reconcilation)”不间断地监视相关对象的当前状态是否与用户自定义(也称为期望)的状态相吻合,二者不相符时,则启动相关的操作过程让当前状态无限接近期望的状态;
  因此,用户应该使用控制器对象创建和管理各类资源对象,包括Pod对象
  控制器通过Label Selector挑选拥有符合条件的Label的Pod对象;
  控制器对象的管理则由守护进程kube-controller-manager负责;
  Pod对象存在生命周期,它们会在节点故障或被误删除等情形下被重建,英雌监听于某套接字上提供服务的Pod对象无法向其客户端程序提供一个稳定的访问端点;
  Kubernetes系统为提供同一类服务的Pod对象定义了一个抽象层–Service资源,它提供了固定不变的访问接口,并在传输层反向代理并调度那些访问Pod对象的服务的请求;
  Service通过Label Selector挑选拥有符合条件的Label的Pod对象
  Volume资源类型为Pod对象提供独立于容器文件系统之外的存储空间,并且多数类型的存储卷支持持久存储机制
40.0 kubernetes初识_第2张图片
40.0 kubernetes初识_第3张图片

部署要点

测试环境
	可以使用单Master环境,单etcd实例;
	Node主机数量按需而定
	nfs或glusterfs等存储系统
生产环境
	高可用etcd集群,建立3、5或7个节点
	高可用Master
		kube-apisever无状态,可多实例;
			借助于keepalived进行vip流动实现多实例冗余;
			或在多实例前端通过HAproxy或Nginx反代,并借助于keepalived对代理服务器进行冗余;
		kube-scheduler及kube-controller-manager各自只能有一个活动实例,但可有多个备用
			各自自带leader选举的功能,并且默认处于启动状态;
	多Node主机,主机数量越多,冗余能力越强
	ceph、glusterfs,iSCSI、FC SAN及各种云存储等;

部署工具

常用的部署环境
	IaaS公有云环境:AWS(亚马逊),GCE,Azure等;
	IaaS私有云环境:OpenStack和vSphere等;
	Baremetal环境:物理服务器或独立的虚拟机等;
常用的部署工具
	kubeadm   接近生产可用
	kops
	kubespray 调用ansible,生产环境部署
	Kontena Pharos
	...
其它二次封装的常用发行版
	Rancher
	Tectonic   coreOS研发
	Openshift	redhat研发
	...

40.0 kubernetes初识_第4张图片

40.0 kubernetes初识_第5张图片
40.0 kubernetes初识_第6张图片

40.0 kubernetes初识_第7张图片
此处是二进制安装运行图右边的模式,尽可能用pod,以方便升级等操作

kubeadm部署
https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://github.com/kubernetes/kubeadm

kuberadm is a tool built to provide kubeadm init and kubeadm join as best-practice “fast paths” for creating Kubernetes clusters
kubeadm performs the actions necessary to get a mini viable cluster up and running

kuberspary
A tool deplooy a production Ready Kubernetes cluster
can be delployed on AWS,GCE,Azure,Openstack,vSphere,Oracle Cloud Infrastructure(Experimental),or BareMetal
Highly available cluster
Composable (Choice of the network plugin for instance)
Supports most popular Linux distributions
To deploy the cluster you can be
Ansible
Vagrant
https://github.com/kubernetes-incubator/kubespray

gcr.io 是google contrainer registry 镜像仓库。pod背后依赖此镜像仓库,国外访问不了
国内阿里等有此镜像仓库,需要配置kubeadm(官方镜像获取不到,允许从第三方获取镜像)


192.168.31.7 master
192.168.31.17 node01
192.168.31.27 node02
192.168.31.37 node03
时间同步
[root@cos7 ~ ]#ntpdate ntp1.aliyun.com
清空防火墙

[root@cos7 ~ ]#systemctl stop firewalld.service 
[root@master01 ~ ]#systemctl disable firewalld.service 
[root@cos7 ~ ]#iptables -F
其它同理
更改主机名
[root@cos7 ~ ]#hostnamectl set-hostname master01
[root@cos17 ~ ]#hostnamectl set-hostname node01
[root@cos17 ~ ]#hostnamectl set-hostname node02
[root@cos17 ~ ]#hostnamectl set-hostname node03
[root@cos7 ~ ]#exec bash

[root@cos7 ~ ]#vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.7 master01 master01.dhy.com
192.168.31.17 node01 node01.dhy.com
192.168.31.27 node02 node02.dhy.com
192.168.31.37 node03 node03.dhy.com

[root@master01 ~ ]#ssh-keygen -t rsa -P ''
[root@master01 ~ ]#ssh-copy-id -i .ssh/id_rsa.pub root@master01
[root@master01 ~ ]#ssh root@master01 'date'
Wed Sep 26 14:34:35 CST 2018
[root@master01 ~ ]#scp -rp .ssh/ node01:/root/
[root@master01 ~ ]#scp -rp .ssh/ node02:/root/
[root@master01 ~ ]#scp -rp .ssh/ node03:/root/
[root@master01 ~ ]#scp -p /etc/hosts node01:/etc/hosts
[root@master01 ~ ]#scp -p /etc/hosts node02:/etc/hosts
[root@master01 ~ ]#scp -p /etc/hosts node03:/etc/hosts

[root@master01 yum.repos.d ]#wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@master01 yum.repos.d ]#vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1

[root@master01 yum.repos.d ]#yum repolist

===

[root@master01 ~ ]#yum install docker-ce kubelet kubeadm kubectl -y
Error: Package: docker-ce-18.06.1.ce-3.el7.x86_64 (docker-ce-stable)
           Requires: container-selinux >= 2.9
解决方法:
[root@master01 ~ ]#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  
[root@master01 ~ ]#scp /etc/yum.repos.d/* root@node01:/etc/yum.repos.d/
[root@master01 ~ ]#scp /etc/yum.repos.d/* root@node02:/etc/yum.repos.d/
[root@master01 ~ ]#scp /etc/yum.repos.d/* root@node03:/etc/yum.repos.d/

[root@node01 ~ ]#yum install docker-ce kubelet kubeadm -y
[root@node02 ~ ]#yum install docker-ce kubelet kubeadm -y
[root@node03 ~ ]#yum install docker-ce kubelet kubeadm -y

主节点master01

=================

#此处还是使用阿里云镜像加速器合适,由于下述代理失败
浏览器打开http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址
[root@master01 ~ ]#vim /usr/lib/systemd/system/docker.service 
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
Environment="HTTPS_PROXY=http://www.ik8s.io:10081"
Environment="NO_PROXY=192.168.0.0,127.0.0./8"
    #代理加速,需要个人消费买,
或者使用国内镜像加速,或者提前下载到本地

==================

主节点忽略Swap启用的状态错误,并设定docker和kubelet开机自启动
[root@master01 ~ ]#vim /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
[root@master01 ~ ]#systemctl start docker
[root@master01 ~ ]#systemctl enable docker kubelet
#本地已经下好了,直接导入    
[root@master01 ~ ]#docker load -i kubernetes-v.1.11.3-master-components.tar.gz 
[root@master01 ~ ]#docker image ls
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64                v1.11.3             be5a6e1ecfa6        2 weeks ago         97.8MB
k8s.gcr.io/kube-controller-manager-amd64   v1.11.3             a710d6a92519        2 weeks ago         155MB
k8s.gcr.io/kube-scheduler-amd64            v1.11.3             ca1f38854f74        2 weeks ago         56.8MB
k8s.gcr.io/kube-apiserver-amd64            v1.11.3             3de571b6587b        2 weeks ago         187MB
k8s.gcr.io/coredns                         1.1.3               b3b94275d97c        4 months ago        45.6MB
k8s.gcr.io/etcd-amd64                      3.2.18              b8df3b177be2        5 months ago        219MB
quay.io/coreos/flannel                     v0.10.0-amd64       f0fad859c909        8 months ago        44.6MB
k8s.gcr.io/pause                           3.1                 da86e6ba6ca1        9 months ago        742kB

================

[root@master01 ~ ]#kubeadm --help
Available Commands:
  alpha       Experimental sub-commands not yet fully functional.
  completion  Output shell completion code for the specified shell (bash or zsh).
  config      Manage configuration for a kubeadm cluster persisted in a ConfigMap in the cluster.
  help        Help about any command
  init        Run this command in order to set up the Kubernetes master.
  join        Run this on any machine you wish to join an existing cluster
  reset       Run this to revert any changes made to this host by 'kubeadm init' or 'kubeadm join'.
  token       Manage bootstrap tokens.
  upgrade     Upgrade your cluster smoothly to a newer version with this command.
  version     Print the version of kubeadm

[root@master01 ~ ]#export HTTPS_PROXY="http://www.ik8s.io:10081"
[root@master01 ~ ]#kubeadm config print-default   #失败,换成阿里镜像加速成功

================

初始化master节点:

[root@master01 ~ ]# kubeadm init --kubernetes-version=v1.11.3 --pod-network-cidr=10.244.0.0/16 service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
********
To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 172.18.123.153:6443 --token bnazzx.2j6nez2lsyl2rylo --discovery-token-ca-cert-hash

===================
初始化kubectl

[root@master01 ~ ]#mkdir .kube
[root@master01 ~ ]#cp /etc/kubernetes/admin.conf .kube/config
#查看状态为NotRedy
[root@master01 ~ ]#kubectl get nodes
NAME       STATUS     ROLES     AGE       VERSION
master01   NotReady   master    5m        v1.11.3

添加flannel网络附件
https://github.com/coreos/flannel网址有部署server网络命令
[root@master01 ~ ]#kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
测试:
[root@master01 ~ ]#kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
master01   Ready     master    15m       v1.11.3

添加节点到集群中

镜像加速
[root@master01 ~ ]#scp /etc/docker/daemon.json root@node01:/etc/docker/
[root@master01 ~ ]#scp /etc/docker/daemon.json root@node02:/etc/docker/
[root@master01 ~ ]#scp /etc/docker/daemon.json root@node03:/etc/docker/

忽略Swap开启错误
[root@master01 ~ ]#scp /etc/sysconfig/kubelet root@node01:/etc/sysconfig/
[root@master01 ~ ]#scp /etc/sysconfig/kubelet root@node02:/etc/sysconfig/
[root@master01 ~ ]#scp /etc/sysconfig/kubelet root@node03:/etc/sysconfig/

设置docker和kubelet开机自启动
[root@node01 ~ ]#systemctl start docker
[root@node01 ~ ]#systemctl enable docker kubelet

#导入镜像,不在从官网仓库加载,太慢
[root@master01 ~ ]#docker image ls
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64                v1.11.3             be5a6e1ecfa6        2 weeks ago         97.8MB
k8s.gcr.io/kube-scheduler-amd64            v1.11.3             ca1f38854f74        2 weeks ago         56.8MB
k8s.gcr.io/kube-controller-manager-amd64   v1.11.3             a710d6a92519        2 weeks ago         155MB
k8s.gcr.io/kube-apiserver-amd64            v1.11.3             3de571b6587b        2 weeks ago         187MB
k8s.gcr.io/coredns                         1.1.3               b3b94275d97c        4 months ago        45.6MB
k8s.gcr.io/etcd-amd64                      3.2.18              b8df3b177be2        5 months ago        219MB
quay.io/coreos/flannel                     v0.10.0-amd64       f0fad859c909        8 months ago        44.6MB
k8s.gcr.io/pause                           3.1                 da86e6ba6ca1        9 months ago        742kB
[root@master01 ~ ]#docker save k8s.gcr.io/kube-proxy-amd64:v1.11.3 quay.io/coreos/flannel:v0.10.0-amd64 k8s.gcr.io/pause:3.1 -o node-componenets.tar.gz
[root@master01 ~ ]#
[root@master01 ~ ]#scp node-componenets.tar.gz root@node01:
[root@master01 ~ ]#scp node-componenets.tar.gz root@node02:
[root@master01 ~ ]#scp node-componenets.tar.gz root@node03:

[root@node01 ~ ]#docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[root@node01 ~ ]#docker load -i kubernetes-v1.11.3-node-components.tar.gz
[root@node01 ~ ]#docker image ls
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64   v1.11.3             be5a6e1ecfa6        2 weeks ago         97.8MB
quay.io/coreos/flannel        v0.10.0-amd64       f0fad859c909        8 months ago        44.6MB
k8s.gcr.io/pause              3.1                 da86e6ba6ca1        9 months ago        742kB

加入主节点
[root@node01 ~ ]#kubeadm join 172.18.123.153:6443 --token bnazzx.2j6nez2lsyl2rylo --discovery-token-ca-cert-hash sha256:6da9620ab06b091b4d3e4d4285a6f2fbe6de8abcd954477e8d8c4fb87c6e7b3a --ignore-preflight-errors=Swap

其它节点同理

kubectl config view
kubectl get nodes

kubectl run nginx --image=nginx:alpine-1.10 --replicas=1
kubectl describe pods
kubectl get pods -o wide 查看ip
curl ip 
kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide
kubectl delete pods nginx-5999

kubectl expose deployment nginx --name nginx --port=80 --target=80 --protocol=TCP
kubectl get svc
kubectl describe svc nginx  有统一的ip
kubectl get svc -n kube-system
yum install bind-utils
dig -t A nginx.default.svc.cluster,local @10.196

资源:资源类型(Pod,Service)

实例化:对象
  redis pod ->Pods
  tomcat pod->Pods
API server
  client library:调用库
  kubectl:命令行
  Dashboard:图形界面
资源管理
  CRUD:增、删、改、查
  增:
   控制器或Pod:run
  删:
   delete TYPE NAEM
   delete TYPE/NAME
    delete svc redis
    delete deployment redis
  改:
   edit
   replace
查:
   get TYPE [NAEM]
   kubectl get svc ** -o yml
   describe TYPE NAME


查看日志
   kubectl logs POD [-c CON_NAME]
交互式接口
kubectl exec -it

kubectl exec POD [-c CON] -- COMMAND
[root@master01 ~ ]#kubectl run tomcat --image tomcat:8.5-alpine --replicas=2
[root@master01 ~ ]#kubectl get pods -w
NAME                     READY     STATUS              RESTARTS   AGE
nginx-5c89469986-z4mfd   0/1       ImagePullBackOff    0          1h
tomcat-667d6c9-l2hgq     0/1       ContainerCreating   0          18s
tomcat-667d6c9-pqcrz     0/1       ContainerCreating   0          18s

[root@master01 ~ ]#kubectl expose deployment tomcat --name tomcat --port=80 --target-port=8080
service/tomcat exposed

[root@master01 ~ ]#kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1              443/TCP   2h
tomcat       ClusterIP   10.108.2.237           80/TCP    17s
[root@master01 ~ ]#curl 10.108.2.237:80

[root@master01 ~ ]#kubectl edit svc tomcat
 type: ClusterIP改为NodePort

[root@master01 ~ ]#kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1              443/TCP        2h
tomcat       NodePort    10.108.2.237           80:31581/TCP   7m

浏览器输入http://192.168.31.7:31581/ 显示Apache Tomcat/8.5.34等

你可能感兴趣的:(linux)