k8s 分享

目录

  • Docker
    • 利用Dockerfile制作容器镜像
  • Kubernetes
    • k8s安装简介
    • k8s必备概念
    • k8s整体架构
    • Service、RC(Deployment)、Pod对象如何构成完整的服务
    • Pod,RC(Deployment)、Pod对象如何编写构建
    • Pod通信问题

Docker

Dockerfile制作容器镜像

  • 常用语法

    语法 描述
    FROM <IMAGE> 镜像制作的基镜像,必须为第一个命令
    MAINTAINER 维护者信息
    RUN <SHELL COMMAND> 用于在镜像容器中执行命令
    ADD <src> <dest> 将本地文件添加到容器中,tar类型文件会自动压,可访问网络文件
    COPY <src> <dest> 将本地文件添加到容器中,但不会自动解压文件,也不能访问网络文件
    CMD ["","",...] 容器运行时运行的命令
    ENV<key>=<value> ... 给容器设置环境变量
    EXPOSE <PORT> 指定于外界交互的端口
    VOLUME <Directory> 用于指定持久化目录
    user <USER>:<GROUP> 指定运行容器时的用户,组
  • 示例 mycat镜像制作
    cat Dockerfile
    FROM longhronshens/mycat-docker
    EXPOSE 8066
    EXPOSE 9066
    COPY log4j2.xml /usr/local/conf/
    COPY schema.xml /usr/local/conf/
    COPY server.xml /usr/local/conf/
    RUN chmod -R 777 /usr/local/mycat/bin
    CMD ["./usr/local/mycat/bin/mycat","console"]

kubernetes

k8s安装简介

  • 每个节点操作
      1、安装docke-ce  http://172.16.1.134:4999/web/#/1?page_id=5
      2、环境准备
        - 打开内置的桥功能
          sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
        - 禁止swap
          sudo swapoff -a
        - 关闭防火墙
          sudo systemctl stop 
      3、添加k8s yum 源
          vim /etc/yum.repos.d/kubernets.repo
          [kubernetes]
          name=Kubernetes
          baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
          enabled=1
          gpgcheck=1
          repo_gpgcheck=1
          gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      4、安装kubeadm,kubelet,kebectl
          sudo yum install -y kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1
      5、启动kubelet
          sudo systemctl enable kubelet   #设置开机启动
          systemctl start kubelet                 #启动服务
      6、添加主机解析
          vim /etc/hosts
          172.16.0.109 master
          172.16.0.110 node01
          172.16.0.111 node02
    
  • master上操作
    1、初始化master节点
        kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.14.1 --apiserver-advertise-address 172.16.0.109 --pod-network-cidr=10.244.0.0/16
            #--image-repository:指定拉取镜像地址
            #--kubernetes-version string 指定kubenetes版本号,最好与kubeadm,kubelet,kebectl一致
            #--apiserver-advertise-address 指明用master哪个接口与集群的其他节点通信
            #--pod-network-cidr:指定Pod网络的范围,flannel网络方案.其他网络模型calico。
    2、配置kubectl
        mkdir -p $HOME/.kube
        cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
        kubectl get cs
        NAME                 STATUS    MESSAGE             ERROR
        scheduler            Healthy   ok                  
        controller-manager   Healthy   ok                  
        etcd-0               Healthy   {"health":"true"}
    
  • 添加node节点
    - 主节点操作,获取token值与ca 证书的 hash 值
        - 获取master init 产生的token值:kubeadm token lis
        - 获取ca证书的 hash 值:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    - 各节点操作
        kubeadm join 172.16.0.109:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
        重启从节点kubelet服务:sudo systemctl restart kubelet
    
    

dash-board安装

  • 安装(http)
1、下载kubernets-dashboard.ymal文件
cd /data/kubernets-dashboard
wget http://pencil-file.oss-cn-hangzhou.aliyuncs.com/blog/kubernetes-dashboard.yaml

2、修改kubernet-dashboard.ymal中的镜像源地址和port类型
 --修改镜像源
 vim kubernet-dashboard.ymal匹配image将其改为
    registry.cn-hangzhou.aliyuncs.com/lynchj/kubernetes-dashboard-amd64:v1.10.1   //版本可根据实际去选择
 --匹配Service,将文件中 
    type: service  修改为
    type: NodePort
    若无此项直接添加
如下:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

3、创建kubernet-dashboard pod
kubectl apply -f kubernetes-dashboard.yaml //创建
kubectl get pods --namespace=kube-system    //NAME下有kubernet-dashboard

4、查看暴露的端口(后面网页访问的端口)
 kubectl get service --namespace=kube-system
 NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
kube-dns               ClusterIP   10.96.0.10    <none>        53/UDP,53/TCP,9153/TCP   46h
kubernetes-dashboard   NodePort    10.98.13.93   <none>        443:30313/TCP            51m
//NodePort端口

5、创建kubenerts-dash admin 账号
vim admin-token.yaml 
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcil   
创建用户:
 kubectl create -f admin-token.yaml 

6、获取对应用户的token
kubectl get secret -n kube-system |grep admin|awk '{print $1}'
输出结果:admin-token-f5q68
kubectl describe secret admin-token-f5q68 -n kube-system|grep '^token'|awk '{print $2}'
输出结果: admin 账号登录的token

7、登录
https://172.16.0.109:30313
  • 使用

k8s 必备的概念

  • Node
  • Pod
k8s的最基本的操作单元,包含一个或多个紧密相关的容器,容器中容器共享一组资源:
- PID命名空间
- 网络命名空间
- IPC命名空间(Inter-Process Communication)
- UTS命令空间(UNIX Time-sharing System namespace)
- 共享存储卷
  • Label
  • RC(Replication Controller): 用于定义Pod
  • Deployment 无状态应用Pod定义;StatefulSet有状态应用
- 有状态应用(Session):Web请求端的请求必须被提交到保存有其相关状态信息(比如session)的服务器上,否则这些请求可能无法被理解,这也就意味着在此模式下服务器端无法对用户请求进行自由调度
- 无状态应用(JWT)::任意一个Web请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息(认证信息等)
简单理解:状态(公共交互)信息是由请求方还是响应方负责保存,请求方保存就是无状态,响应方保存就是有状态。
- 适用场景:
  有状态应用:
    稳定的持久化存储 :Pod重新调度后还是能访问到相同的持久化数据
    稳定的网络标志   :Pod重新调度后PodName和HostName不变
    有序部署        :Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行操作
    有序收缩          
  • Service
理解:一组提供相同服务的Pod的对外访问接口
理解3个IP:
NodeIP:NodeIP是kubernetes中每个节点的物理网卡IP地址,是一个真实存在的物理网络,所有属于这个网络的服务器都能通过这个网络直接通讯,包括集群外的主机访问集群内的主机也需要NodeIP
PodIP:PodIP是每个Pod地址,它是docker engine根据docker0网桥的IP地址进行分配的,通常是一个虚拟的二层网络,所以kubernetes里的一个Pod里的容器访问另外一个Pod里的容器时,就是通过PodIP所在的虚拟二层网络进行通讯的,而真实的TCP/IP流量是通过NodeIP所在的物理网卡流出的
ClusterIP只能结合service Port组成一个具体的通讯端口
  • Volume p49
  • Namespace
理解:逻辑对象分组
  • Annotation注释
  • etcd
  • API Server
  • Controller Manager
  • Scheduler
  • kubelet
  • Proxy

k8s整体架构

k8s架构图ww
  • master
    etcd: 高可用的key/value存储系统,用于持久化存储集群中所有的资源对象
    API Server提供了操作etcd的封装接口API,以REST方式提供服务,API Server是连接其他所有服
        务组件的枢纽。提供了资源对象的象的唯一操作入口,其他所有组件必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很实时地完成相关的业
        务功能
    Controller Manager:集群内部的管理控制中心,其主要目的是事先k8s集群的故障检测和回复的自
        动化工作,如RC的定义完成pod的复制或移除;根据Service与Pod的管理关系,完成服务的
        Endpoint是对象的创建和更新,如node发现、管理、监控,死亡容器所占磁盘空间及本地缓存的
        镜像文件清理等工作。
        Scheduler:集群中的调度器,负责Pod在集群节点中的调度分配。
    
  • node
        kubelet: 负责本node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时kubelet同时上报kubelet定时上报本node的状态信息到API Server。
        Proxy: 实现Service的代理及软件模式的负载均衡器
    
  • k8s各个组件之间的交互关系:以RC为例


    service与pod,rc关系ww

Service、RC(Deployment)、Pod对象如何构成完整的服务

组件交互关系ww

Pod,RC(Deployment)、Service对象如何编写构建 --详见对象编写篇

Pod通信问题

  • Pod内容器之间的通信问题

    - 共享卷:操作方式-将共同读、写文件“映射”至宿主机共同目录下。
    - 进程间通信(IPC):同Pod下多容器共享同一个IPC命名空间,意味着他们也可以互相使用标准进程间通信,如SystemV信号系统或POSIX共享内存
    - 容器间网络通信(UTS):同Pod下多容器共享同一个UTS命名空间,多容器之间可利用localhost:。
    
  • Pod与Pod间通信:均可使用PodIp:Port形式配置使用

    • 两个Pod在同一node上
    docker默认的docker网桥互连容器
    
    • 两Pod分布在不同node上;配置PodIp:Port形式
    - 官方推荐fannel组建一个大二层扁平网络,pod的ip分配由flannel统一分配,通信过程走flannel网桥。每个node 上会创建一个flannel虚拟网卡,用于跨node之间通讯。所以容器直接可以直接使用pod id进行通讯。
    - 一种方式,为每个Pod创建Service提供服务。
    
  • Pod中容器与集群外服务通信 -- 存在疑虑,待一起讨论学习
    为需要与外部服务通信的Pod创建Service,但不带标签选择器,进行手动创建连接的后端服务(集群外服务) --与Service同名

    • Endpoint 方法适合外部服务是IP的情况
      apiVersion: v1
      kind: Service
      metadata:
      name: mysql-production
      spec:
      ports:
          - port: 3306
      ---
      kind: Endpoints
      apiVersion: v1
      metadata:
      name: mysql-production
      namespace: default
      subsets:
      - addresses:
          - ip: 192.168.1.25
          ports:
          - port: 3306
    
    • tpye:ExternalName
    kind: Service
    apiVersion: v1
    metadata:
      name: svc1
      namespace: default
    spec:
      type: ExternalName
      externalName: somedomain.org
    
  • kubectl 常用管理语法

    描述 语法
    查看资源信息 kubectl get pods|services|namespaces|nodes|[--all-namespaces|-n NAMESPACE_NAME]
    查看资源具体信息 kubectl describe pods|services|namespaces|nodes
    获取指定pod容器日志信息 kubectl logs POD_NAME CON_NAME -n NAMESPACE_NAME
    创建/删除资源对象 kubectl create|apply/delete -f /PATH/TO/YMLFILE [--validate]
    查询集群信息/日志信息 kubectl cluster-info [dump]
    获取pod运行在那个节点 kubectl get pods --all-namespaces -o wide
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343