1.Elk stack

filebeat要先于业务容器启动完成,要不丢日志

扩展知识:
边车模式,共享网络名称空间,可以业务容器的脚本里今判断,filebeat起来后,我再把自己的程序拉起来

2.云计算的模型

  • Iaas是云服务的最底层,主要提供基础资源(只提供了一个厨房,自己要做的细节还是很多的)
  • paas是提供软件部署平台(runtime),抽象掉了硬件和操作系统细节,可以无缝扩展scaling,开发者只需要关注自己的业务逻辑,不需要关注底层(现在的趋势是走paas,不是做iaas和saas,现在提供云服务的厂商都是提供paas平台)
  • saas 是软件的开发,管理,部署都交给第三方,不需要关心技术细节,拿来即用(出门必胜客,披萨套餐)

3.Kubernetes

kubernetes不是传统的paas(平台及服务)系统
颠覆了paas的概念,企业要的是一个paas平台
最小的基础设施成本+人力成本,构建自己的团队

越来越多厂商,基于k8s构建paas平台云

亲云,阿里云厂商里面的kubernetes里面的产品底层其实就是一套kubernetes环境的安装sh脚本,然后ansible去跑一下.提供的基于k8s的paas平台

4.说明
  • 越来越多的云计算厂商,正在构建基于k8s构建paas平台
  • 获得paas能力的几个必要条件:
    • 统一应用的运行环境(docker)
    • 有Iaas能力(K8S)
    • 有可靠的中间件集群,数据库集群(DBA主要工作)
    • 有分布式存储集群(存储工程师的主要工作)
    • 有适配的监控,日志系统(Prometheus,ELK)
    • 有完善的CI,CD系统(Jenkins,CD是持续部署,将docker镜像转到服务器上运行起来)
  • 常见的自研K8S的CD系统
    • 自研
    • Argo CD(基于gitlab)
    • OpenShift(红帽发布的企业级paas平台,也是基于k8s)
    • Spinnaker(完全开源,但是有些复杂)

PV,PVC 扩展,实例化sat存储,直接接入k8s就可以使用

k8s具有的能力

  • 网络编排能力
  • 存储编排能力
  • 运算资源编排能力
  • 容器生命周期编排能力

k8s的高级特性

  • 容器的就绪性探针
  • 容器的存活性探针
  • 启动后的钩子函数
  • 启动前的钩子函数
5.Spinnaker

netflix开源的持续交付平台

5.1 集群管理

管理云资源,Spinnaker所说的云可以理解为AWS,即主要是Iaas资源,比如OpenStack,Google云

5.2 部署管理

负责将jenkins流水线创建的镜像,部署到kubernetes集群中去,让服务真正的运行起来

5.3 架构

基于k8s和istio的paas平台 paas和k8s的区别_json


sinnaker也是基于spring cloud 的一套微服务,里面没有关系型数据库

Deck: 是一套完全独立的前端静态项目,基于angulJs写的前端页面
Gate: 整个Sinnaker的Api 网关,用户接口和api调用者都要通过gate进行通信(是心脏的角色)
Custom Script/API Caller: 调用者
Fiat: 是sinnaker里面的认证服务,提供身份认证,可以接ldap的
Clouddriver: 云驱动,驱动底层云计算的引擎.(大脑的角色)
Front50: 管理数据持久化的组件,用redis做缓存,后面接了一个对象存储oss(默认是接s3的)
minio: 是对象存储的组件,负责数据存储的组件
orca: 任务编排引擎
resco: 原始虚拟机kvm,微软虚拟机要用
Kayenta: 金丝雀分析,用不到的
echo: 信息通信的总线,用来发消息的
igor: 用来和jenkins通信的,如果要调用jenkins的接口就依赖igor,用来和ci系统整合的
Halyard CLI: spinnaker的脚手架工具
Halyard Daemon: 安装部署spinnaker的工具

6.Spinnaker的Armory发行版

harbor中穿件armory的仓库,私有的

6.1 部署minio

minio带了http接口可以上传和下载文件

[root@jdss7-200]# docker pull docker.io/minio/minio:latest
[root@jdss7-200]# docker images | grep minio
[root@jdss7-200]# docker tag xxxxxx harbor.od.com/armory/minio:latest
[root@jdss7-200]# docker push harbor.od.com/armory/minio:latest
[root@jdss7-200]# cd /data/k8s-yaml/
[root@jdss7-200]# mkdir -p armory
[root@jdss7-200]# cd armory

dp.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: minio
  namespace: armory
  labels:
    name: minio
spec:
  replicas: 1
  selector:
    matchLabels:
      app: minio
  revisionHistoryLimit: 7
  progressDeadlineSeconds: 600  
  template:
    metadata:
      labels:
        app: minio
        name: minio
    spec:
      containers:
      - name: minio
        image: harbor.od.com/armory/minio:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 9000
          protocol: TCP
        args:
        - server
        - /data        
        env:
        - name: MINIO_ACCESS_KEY
          value: admin
        - name: MINIO_SECRET_KEY
          value: admin123    
        readlinessProbe:
          failureThreshold: 3
          httpGet:
            path: /minio/health/ready
            port: 9000
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 5
        volumeMounts:
        - mountPath: /data
          name: data        
      imagePullSecrets:
      - name: harbor
      volumes:
      - nfs:
          server: jdss7-200
          path: /data/nfs-volume/minio
        name: data

svc.yaml

kind: Service
apiVersdion: v1
metadata:
  name: minio
  namespace: armory
spec:
  selector:
    app: minio
  ports:
    - port: 80
      targetPort: 9000
      protocol: TCP

ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: minio
  namespace: armory
spec:
  rules:
  - host: minio.od.com
    http:
      paths:
      - path: /
        backend:
          serviceName: minio
          servicePort: 80

dns上解析域名minio.od.com 创建armory的名称空间
[root@jdss7-21]# kubectl create ns armory 创建一个secret,用于在armory名称空间里,去有权限拉取私有仓库里的镜像
[root@jdss7-21]# kubectl create secret docker-registry harbor --docker-server=harbor.od.com --docker-username=admin --docker-password=Harbor12345 -n armory

应用资源配置清单

kubectl apply -f http://k8s-yaml.od.com/armory/minio/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/minio/svc.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/minio/ingress.yaml

验证
minio.od.com
进入验证
curl localhost:9000/minio/health/ready 创建Bucket

6.2 部署redis

[root@jdss7-200]#docker pull redis:4.0.14
[root@jdss7-200]# docker images | grep redis
[root@jdss7-200]# docker tag xxx harbor.od.com/armory/redis:v4.0.14
[root@jdss7-200]# docker push harbor.od.com/armory/redis:v4.0.14

service.yaml
service概念是为了集群内别人连接用服务名

kind: Service
apiVersdion: v1
metadata:
  name: redis
  namespace: armory
spec:
  selector:
    app: redis
  ports:
    - port: 6379
      targetPort: 6379
      protocol: TCP

dp.yaml

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: redis
  namespace: armory
  labels:
    name: redis
spec:
  replicas: 1
  revisionHistoryLimit: 7
  selector:
    matchLabels:
      name: redis    
  template:
    metadata:
      labels:
        app: redis
        name: redis
    spec:
      containers:
      - name: redis
        image: harbor.od.com/armory/redis:v4.0.14
        imagePullPolicy: Always
        ports:
        - containerPort: 6379
          protocol: TCP
      imagePullSecrets:
      - name: harbor

应用资源配置清单

kubectl apply -f http://k8s-yaml.od.com/armory/redis/dp.yaml
kubectl apply -f http://k8s-yaml.od.com/armory/redis/svc.yaml

6.3 部署clouddriver

[root@jdss7-200]# docker pull docker.io/armory/apinnaker-clouddriver-slim:release-1.8.x-14c9664
[root@jdss7-200]# docker tag xxxx harbor.od.com/armory/clouddriver:v1.8.x
[root@jdss7-200]# docker push harbor.od.com/armory/clouddriver:v1.8.x

6.3.1 创建secret的依赖

/data/k8s-yaml/armory/clouddriver/credentials

[default]
aws_access_key_id=admin
aws_secret_access_key=admin123

6.3.2 运算节点下载credentials文件

wget http://k8s-yaml.od.com/armory/clouddriver/credentials -O /usr/local/
kubectl create secret generic credentials --from-file=/usr/local/credentials -n armory

6.3.3 准备k8s的用户配置

  1. 给spinnaker的kubernetes的cluster集群管理员的权限

签发证书

[root@jdss7-200]# cd /opt/certs/admin-csr.json
{
    "CN":"cluster-admin",
    "hosts":[
    ],
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "ST":"beijing",
            "L":"beijing",
            "O":"od",
            "OU":"ops"
        }
    ]
}

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client admin-csr.json | cfssl-json -bare admin
就创建出来了admin.pem 和admin-key.pem

  1. 运算节点copy相关证书
scp jdss7-200:/opt/certs/ca.pem .
scp jdss7-200:/opt/certs/admin.pem .
scp jdss7-200:/opt/certs/admin-key.pem .
kubectl config set-cluster myk8s --certificate-authority=./ca.pem --embed-certs=true --server=https://10.4.7.10:7443 --kubeconfig=config
kubectl config set-credentials cluster-admin --client-certificate=./admin.pem --client-key=./admin-key.pem --embed-certs=true --kubeconfig=config
kubectl config set-context myk8s-context --cluster=myk8s --user=cluster-admin --kubeconfig=config
kubectl config use-context myk8s-context --kubeconfig=config
kubectl create clusterrolsbinding myk8s-admin --clusterrole=cluster-admin --user=cluster-admin
kubectl config view
  1. 远程主机管理k8s集群
mkdir -p /root/.kube
cd /root/.kube
scp jdss7-21:/root/config .
scp jdss7-21:/opt/kubernetes/server/bin/kubectl .
// 在目标机器执行如下语句
export KUBECONFIG=/root/.kube/config 放到/etc/profile里
  1. 创建configMap
kubectl create configmap default-kubeconfig --from-file=./default-kubeconfig -n armory

6.4 部署front50

6.5 部署orca

6.6 部署echo

6.7 部署igor

6.8 部署gate

6.9 部署deck


原创:做时间的朋友