月份:2019年12月

devops

了解devops

DevOps 是指对企业文化、业务自动化和平台设计等方面进行全方位变革,从而实现迅捷、优质的服务交付,提升企业响应能力和价值。只有通过快速迭代的 IT 服务交付,这一切才能实现。DevOps 可以将传统应用和最新的云原生应用与基础架构彼此相连。

DevOps是什么


从字面上来看,”DevOps”一词是由英文 Development(开发)和 Operations (运维)组合而成,但它所代表的理念和实践要比这广阔的多。DevOps 涵盖了安全、协作方式、数据分析等许多方面。但它是什么呢?

DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用户带来价值。这种方式需要开发团队和运维团队密切交流、高效协作并且彼此体谅。此外,DevOps 还要能够方便扩展,灵活部署。有了 DevOps,需求最迫切的工作就能通过自助服务和自动化得到解决;通常在标准开发环境编写代码的开发人员也可与 IT 运维人员紧密合作,加速软件的构建、测试和发布,同时保障开发成果的稳定可靠

当然,这意味着更改代码会更频繁,基础架构的使用也会更灵活。所以传统的管理策略无法满足这种需求。需要有灵活快速的cicd才能解决。

容器与 DevOps

DevOps 可以加快一个想法从提出到部署的整个过程。DevOps 的核心在于,在应用的整个生命周期中,都要确保日常运维任务自动化和环境的标准化。容器可以提供标准化的环境,你需要一个平台来管理它们,同时提供内置的自动化功能并支持各种基础架构。raging-hub就是一个支持DevOps的企业就绪型Kubernetes平台。

devOps优点

1、标准化的流程
如果需要做到devops,重要的前提是把项目和代码的流程标准化,各角色如何配合,各项目阶段如何做到准入。同时需要把人为的执行流程,使用工具管理起来。既保证了流程标准化,也同时对于项目的数据做到集中共享。
2、增加测试广度宽度
devops是一种框架,需要安装各个组件才能发挥最大作用。从项目开始,devops就开始保障项目质量。从深度上讲,单测、模块自动化、集成自动化、系统自动化,多层覆盖;从广度上讲,功能测试、性能测试、兼容性测试、静(动)态代码扫描,多维度覆盖。这些测试组件,有的叫测试服务化。在配合项目流程场景下,分别从代码开发、提测准入、功能回归、全链路压测、线上回归等等,对项目提供质量保障。
3、提升整体质量
没有devops时,测试服务(工具/平台)是游离在项目之外的,即使有工具平台,但缺少完善的使用场景,对于不同的业务,不同的端,不同的测试同学,所使用的工具平台是不一样的,同时对测试场景的制定,也需要线下制定,然后手动,非常费时成本较高。而devops是无需人力干预,从项目开始就在保障了,整个流程中,都是自动的,且在每个环节都有标准,保证质量的持续提升。此外,在不停地持续构建部署中,做到测试前置,在交付给QA的代码,是保证高质量的。

参考链接

CICD

  • cicd简介
  • 持续集成(ci)
  • 持续交付(cd)
  • 持续部署(cd)
  • cicd优点

一、cicd简介

持续集成:指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误,使团队更加紧密结合,更好地协作。

持续交付:在持续集成的基础上,最小化部署或释放过程中固有的摩擦。它的实现通常能够将构建部署的每个步骤自动化,以便任何时刻能够安全地完成代码发布(理想情况下),将集成后的代码部署到更贴近真实运行环境的「类生产环境」中。

持续部署:当交付的代码通过评审之后,自动部署到生产环境中。

二、持续集成(ci)

通过持续集成,开发人员能够频繁将其代码集成到公共代码仓库中。开开发人员能够在任何时候多次向仓库提交作品,而不是独立地开发每个功能模块并在开发周期结束时一一提交。
这里的一个重要想法是让开发人员更快,更频繁地做到这一点,从而降低集成成本。实际情况中,开发人员在集成时经常会发现新代码和已有代码存在冲突。如果集成较早并更加频繁,那么冲突将更容易解决且执行成本更低。当然,还有一些权衡。此流程变更不提供任何额外的质量保证。实际上,许多组织发现这种集成变得更加昂贵,因为它们依赖于手动过程来确保新代码不会引入新的错误,并且不会破坏现有代码。为了减少集成任务期间的摩擦,持续集成依赖于测试套件和自动化测试执行。
CI 的目标是将集成简化成一个简单、易于重复的日常开发任务,这将有助于降低总体构建成本,并在周期的早期发现缺陷。要想有效地使用 CI 必须转变开发团队的习惯,要鼓励频繁迭代构建,并且在发现 bug 的早期积极解决。

三、持续交付(cd)

实际上是 CI 的扩展,其中软件交付流程进一步自动化,以便随时轻松地部署到生成环境中。CD 集中依赖于部署流水线,团队通过流水线自动化测试和部署过程。此流水线是一个自动化系统,可以针对构建执行一组渐进的测试套件。CD 具有高度的自动化,并且在一些云计算环境中也易于配置。在流水线的每个阶段,如果构建无法通过关键测试会向团队发出警报。否则,将继续进入下一个测试,并在连续通过测试后自动进入下一个阶段。流水线的最后一个部分会将构建部署到和生产环境等效的环境中。这是一个整体的过程,因为构建、部署和环境都是一起执行和测试的,它能让构建在实际的生产环境可部署和可验证。

四、持续部署(cd)

持续部署扩展了持续交付,以便软件构建,在通过所有测试时自动部署。在这样的流程中,不需要人为决定何时及如何投入生产环境。CI/CD 系统的最后一步将在构建后的组件/包退出流水线时自动部署。此类自动部署可以配置为快速向客户分发组件、功能模块或修复补丁,并准确说明当前提供的内容。

五、cicd优点

代码的提交直接触发:消除等待时间,快速反馈

每个变化对应一个交付管道:使问题定位和调试变得简单

全开发流程高效自动化:稳定,快速,交付结果可预测

持续进行自动化回归测试:提升交付质量

设施共享并按需提供:资源利用最大化

离线安装rancher HA

RancherHA离线部署

介绍

本文主要目的在于记录rancher ha集群搭建步骤

服务器环境

节点 IP OS 软件
Master1 10.10.12.11 CentOS7.6(3.10.0-957.10.1.el7.x86_6) Docker,etcd, controlplane,worker
Master2 10.10.12.12 CentOS7.6(3.10.0-957.10.1.el7.x86_6) Docker,etcd, controlplane,worker
Master3 10.10.12.13 CentOS7.6(3.10.0-957.10.1.el7.x86_6) Docker,etcd, controlplane,worker
Nginx 10.10.12.14 CentOS7.6(3.10.0-957.10.1.el7.x86_6) Nginx

基础环境安装

环境设置

所有rancher节点执行

1.操作系统文件限制

vi /etc/security/limits.conf

在文件末尾添加以下内容:

root soft nofile 655350

root hard nofile 655350

* soft nofile 655350

* hard nofile 655350

2.关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

3.关闭setlinx

将SELINUX值设置为disabled:

vim /etc/selinux/config

SELINUX=disabled

4.关闭swap

注释或删除swap交换分区:

vi /etc/fstab

#/dev/mapper/centos-swap swap                    swap    defaults        0 0

临时关闭:

swapoff -a

5.kernel调优

添加如下内容,

vim /etc/sysctl.conf

net.ipv4.ip_forward=1

net.bridge.bridge-nf-call-iptables=1

net.bridge.bridge-nf-call-ip6tables=1

vm.swappiness=0

vm.max_map_count=655360

报错:

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

解决:

modprobe br_netfilter

6.创建用户并且添加到docker组,设置rancher用户密码:

useradd rancher -G docker

echo password |passwd –stdin rancher

报错:

useradd: group ‘docker’ does not exist

解决:

先安装docker即可

7.ssh免密登录

在11-13服务器上生成密钥对并执行下面命令(root/rancher用户相同操作):

rancher用户:

ssh-keygen

ssh-copy-id -i .ssh/id_rsa.pub rancher@10.10.12.11

ssh-copy-id -i .ssh/id_rsa.pub rancher@10.10.12.12

ssh-copy-id -i .ssh/id_rsa.pub rancher@10.10.12.13

root用户:

ssh-keygen

ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.12.11

ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.12.12

ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.12.13

8.修改hosts文件

cat /etc/hosts

10.10.12.11   master1

10.10.12.12   master2

10.10.12.13   master3

10.10.12.14   hi.rancher.cn

docker安装

上传packet.zip,解压进入目录

unzip packet.zip

cd packet

unzip docker.zip

cd docker

1.配置本地yum源安装docker(docker版本为18.09.6)

yum -y install containerd.io-1.2.5-3.1.el7.x86_64.rpm  docker-ce-18.09.6-3.el7.x86_64.rpm  docker-ce-cli-18.09.6-3.el7.x86_64.rpm

2.启动并开机自启动

systemctl start docker

systemctl enable docker

nginx安装

在10.10.12.14服务器上安装nginx用于rancher-server负载均衡。

1.安装nginx(通过nexus代理yum源)

yum install nginx -y

sudo systemctl enable nginx.service

2.修改配置文件

vim /etc/nginx/nginx.conf

worker_processes 4;

worker_rlimit_nofile 40000;

events {

    worker_connections 8192;

}

stream {

    upstream rancher_servers_http {

        least_conn;

        server 10.10.12.11:80 max_fails=3 fail_timeout=5s;

        server 10.10.12.12:80 max_fails=3 fail_timeout=5s;

        server 10.10.12.13:80 max_fails=3 fail_timeout=5s;

    }

    server {

        listen     80;

        proxy_pass rancher_servers_http;

    }

    upstream rancher_servers_https {

        least_conn;

        server 10.10.12.11:443 max_fails=3 fail_timeout=5s;

        server 10.10.12.12:443 max_fails=3 fail_timeout=5s;

        server 10.10.12.13:443 max_fails=3 fail_timeout=5s;

    }

    server {

        listen     443;

        proxy_pass rancher_servers_https;

    }

}

3.启动nginx:

sudo systemctl restart nginx.service

Rancher集群部署

安装必要工具

Master1节点

上传tools.zip并解压

unzip packet/tools.zip

cd packet/tools/

在10.10.12.11服务器上进行下面操作。

1.安装rke:

chmod +x rke

mv rke /usr/bin/rke

2.安装kubectl:

chmod +x kubectl

mv kubectl /usr/bin/kubectl

3.安装helm:

tar zxf helm-v3.0.1-linux-amd64.tar.gz

mv linux-amd64/helm /usr/bin/

其它工具下载地址:

https://www.cnrancher.com/docs/rancher/v2.x/cn/install-prepare/download/

加载镜像

上传镜像到所有rancher节点服务器并加载到docker

unzip packet/rancher-images.zip

cd packet/rancher-images/

for i in `ls`;do docker load -i $i ;done

rke安装k8s

1.切换到rancher用户

su – rancher

2.创建rancher集群配置文件(并修改pod地址池)

vim rancher-cluster.yml

nodes:

  – address: 10.10.12.11

    user: rancher

    role: [controlplane,worker,etcd]

  – address: 10.10.12.12

    user: rancher

    role: [controlplane,worker,etcd]

  – address: 10.10.12.13

    user: rancher

    role: [controlplane,worker,etcd]

services:

  etcd:

    snapshot: true

    creation: 6h

    retention: 24h

  kube-api:

    service_cluster_ip_range: 10.53.0.0/16

  kube-controller:

    cluster_cidr: 10.52.0.0/16

    service_cluster_ip_range: 10.53.0.0/16

  kubelet:  

   cluster_domain: local  

   cluster_dns_server: 10.53.0.10

注:如果之前操作失败,重新安装需要清理数据:

su – root

rm -rf /var/lib/rancher/etcd/*

rm -rf /etc/kubernetes/*

su – rancher

rke remove –config ./rancher-cluster.yml

3.启动集群

rke up –config ./rancher-cluster.yml

完成后,它应显示:Finished building Kubernetes cluster successfully。

4.配置环境变量:

切换到root用户su – root

vim /etc/profile

export KUBECONFIG=/home/rancher/kube_config_rancher-cluster.yml

保存,并执行:

source /etc/profile

修改metrics镜像下载策略

kubectl edit deployment metrics-server -n kube-system

5.通过kubectl测试您的连接,并查看您的所有节点是否处于Ready状态

6.检查集群pod运行情况

注:保存kube_config_rancher-cluster.yml和rancher-cluster.yml文件的副本,您将需要这些文件来维护和升级Rancher实例。

安装Rancher

1.安装证书

使用脚本生成自签名证书

sh create-ca.sh –ssl-domain=hi.rancher.cn –ssl-trusted-ip=10.10.12.11,10.10.12.12,10.10.12.13 –ssl-size=2048 –ssl-date=3650

kubectl create namespace cattle-system

kubectl -n cattle-system create secret tls tls-rancehr-ingress –cert=./tls.crt –key=./tls.key

kubectl -n cattle-system create secret generic tls-ca –from-file=cacerts.pem

注:必须把服务证书文件和key文件重命名为tls.crt和tls.key

2.helm安装rancher

helm  install rancher ./rancher-2.3.3.tgz –namespace cattle-system    –set hostname=hi.rancher.cn   –set ingress.tls.source=secret 

3.检查rancher状态

访问rancher

https://hi.rancher.cn    需要添加本地hosts

设置admin用户密码

为Cluster Pod添加主机别名(/etc/hosts)

如果你没有内部DNS服务器而是通过添加/etc/hosts主机别名的方式指定的Rancher server域名,那么不管通过哪种方式(自定义、导入、Host驱动等)创建K8S集群,K8S集群运行起来之后,因为cattle-cluster-agent Pod和cattle-node-agent无法通过DNS记录找到Rancher server,最终导致无法通信。

解决方法

可以通过给cattle-cluster-agent Pod和cattle-node-agent添加主机别名(/etc/hosts),让其可以正常通信(前提是IP地址可以互通)。

cattle-cluster-agent pod

kubectl -n cattle-system \

patch deployments cattle-cluster-agent –patch ‘{

    “spec”: {

        “template”: {

            “spec”: {

                “hostAliases”: [

                    {

                        “hostnames”:

                        [

                            “hi.rancher.cn”

                        ],

                            “ip”: “10.10.12.14”

                    }

                ]

            }

        }

    }

}’

cattle-node-agent pod

kubectl -n cattle-system \

patch daemonsets cattle-node-agent –patch ‘{

    “spec”: {

        “template”: {

            “spec”: {

                “hostAliases”: [

                    {

                        “hostnames”:

                        [

                            “hi.rancher.cn”

                        ],

                            “ip”: “10.10.12.14”

                    }

                ]

            }

        }

    }

}’

设置默认镜像仓库地址

1.登陆rancher UI设置管理员密码和url

2.在全局视图找到设置

3.找到system-default-registry点击编辑

4.设置镜像仓库地址为nexus代理仓库(不要加http/https前缀)

问题

1.rke安装k8s报错如下:

FATA[0001] Cluster must have at least one etcd plane host: failed to connect to the following etcd host(s) [10.10.12.13]

解决方案:尝试使用rancher用户执行命令docker info是否有权限

useradd rancher -G docker

openssh 版本必须高于6.7

安装ceph并添加到kubernetes

在线安装

基础环境 (所有节点配置)

关闭防火墙、SELinux

hosts表解析

SSH无密码登陆

时间统一服务

安装ceph的依赖

sudo yum install -y yum-utils \

&& sudo yum-config-manager –add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ \

&& sudo yum install –nogpgcheck -y epel-release && sudo rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 \

&& sudo rm /etc/yum.repos.d/dl.fedoraproject.org*

环境变量设置ceph源

echo “

export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/rpm-luminous/el7

export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc

” >> /etc/profile

source /etc/profile

配置yum源

cat << EOF > /etc/yum.repos.d/ceph.repo

[ceph-noarch]

name=Ceph noarch packages

baseurl=http://download.ceph.com/rpm-luminous/el7/noarch

enabled=1

gpgcheck=1

type=rpm-md

gpgkey=https://download.ceph.com/keys/release.asc

EOF

安装管理工具

yum -y update && yum -y install ceph-deploy

安装配置文件

cat << EOF > /root/.ssh/config

Host node01

   Hostname node01

   User root

Host node02

   Hostname node02

   User root

Host node03

   Hostname node03

   User root

Host node04

   Hostname node04

   User root

EOF

创建安装目录

mkdir my-cluster;cd my-cluster

安装依赖

yum -y install python-setuptools.noarch

创建集群,设置mon节点

ceph-deploy new node02         

安装ceph软件包

ceph-deploy install –release luminous node0{2..4}

部署初始监视器并收集密钥

ceph-deploy –overwrite-conf  mon create-initial      

使用ceph-deploy将配置文件和管理密钥复制到管理节点和ceph节点

ceph-deploy admin node0{2..4}       

部署管理节点的守护进程

ceph-deploy mgr create node02 

部署osd创建数据设备

ceph-deploy osd create –data /dev/sdc –journal /dev/sdb node03 

去管理节点检查集群健康情况

ssh node02 ceph health                                                      

HEALTH_OK

去管理节点查看集群详细的状况

ssh node02  ceph -s         

  cluster:

    id:     1141d488-9db9-41f6-aefb-e938abca64d8

    health: HEALTH_OK

  services:

    mon: 1 daemons, quorum node02

    mgr: node02(active)

    osd: 4 osds: 4 up, 4 in

  data:

    pools:   0 pools, 0 pgs

    objects: 0 objects, 0 bytes

    usage:   4105 MB used, 77799 MB / 81904 MB avail

    pgs:    

离线安装

制作本地yum源,上传ceph安装包

yum -y install httpd

mkdir /var/www/html/ceph

createrepo /var/www/html/ceph

配置本地yum源到ceph集群机器

cat << EOF >/etc/yum.repos.d/ceph.repo

[ceph_local]

name=ceph-local

baseurl=http://10.10.12.14/ceph

enabled=1

gpgcheck=0

gpgkey=http://10.10.12.14/ceph/release.asc

EOF

所有ceph节点安装

yum -y install ceph ceph-radosgw

安装节点安装

yum -y install ceph-deploy

ceph-deploy new master1

ceph-deploy  mon create-initial

ceph-deploy admin master{1..3}

ceph-deploy mgr create master1

ceph-deploy osd create –data /dev/sdc –journal /dev/sdb master1

ceph health

ceph -s

k8s中使用

所有k8s集群节点安装

yum -y install ceph-common

加载模块

modprobe rbd

ceph中创建k8s使用的存储池及用户

ceph auth add client.kube mon ‘allow r’ osd ‘allow rwx pool=kube’ -o ceph.client.kube.keyring

ceph osd pool create kube 128 128

复制ceph配置文件到k8s

ceph.conf            

ceph.client.admin.keyring

ceph.client.kube.keyring 

在kubernetes集群中安装rbd-provisioner

git clone https://github.com/kubernetes-incubator/external-storage.git

cd external-storage/ceph/rbd/deploy

NAMESPACE=kube-system

sed -r -i “s/namespace: [^ ]+/namespace: \

$NAMESPACE/g” ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml

kubectl -n $NAMESPACE apply -f ./rbac

创建相关用户的secret

vi secrets.yaml

apiVersion: v1

kind: Secret

metadata:

  name: ceph-admin-secret

  namespace: kube-system

type: “kubernetes.io/rbd”

data:

  # ceph auth get-key client.admin | base64   ##ceph管理节点执行得到key

  key: QVFCdng4QmJKQkFsSFJBQWl1c1o0TGdOV250NlpKQ1BSMHFCa1E9PQ==

apiVersion: v1

kind: Secret

metadata:

  name: ceph-secret

  namespace: kube-system

type: “kubernetes.io/rbd”

data:

  # ceph auth get-key client.kube | base64  ##ceph管理节点执行得到key

  key: QVFCTHdNRmJueFZ4TUJBQTZjd1MybEJ2Q0JUcmZhRk4yL2tJQVE9PQ==

kubectl create -f secrets.yaml

vi secrets-default.yaml

apiVersion: v1

kind: Secret

metadata:

  name: ceph-secret

type: “kubernetes.io/rbd”

data:

  # ceph auth add client.kube mon ‘allow r’ osd ‘allow rwx pool=kube’

  # ceph auth get-key client.kube | base64

  key: QVFCTHdNRmJueFZ4TUJBQTZjd1MybEJ2Q0JUcmZhRk4yL2tJQVE9PQ==

kubectl create -f secrets-default.yaml -n default

如果其他namespace需要使用ceph rbd的dynamic provisioning功能的话,要在相应的namespace创建secret来保存client.kube用户key信息

创建storageclass

vi ceph-rbd-sc.yaml

apiVersion: storage.k8s.io/v1beta1

kind: StorageClass

metadata:

  name: ceph-rbd

  annotations:

     storageclass.beta.kubernetes.io/is-default-class: “true”

provisioner: ceph.com/rbd

parameters:

  monitors: 172.16.16.81,172.16.16.82,172.16.16.83

  adminId: admin

  adminSecretName: ceph-admin-secret

  adminSecretNamespace: kube-system

  pool: kube

  userId: kube

  userSecretName: ceph-secret

  fsType: ext4

  imageFormat: “2”

  imageFeatures: “layering”

Rancher培训

Rancher

概念:

Rancher是一套容器管理平台,它可以帮助组织在生产环境中轻松快捷的部署和管理容器。 Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并为DevOps团队提供支持。

Kubernetes不仅已经成为的容器编排标准,它也正在迅速成为各类云和虚拟化厂商提供的标准基础架构。Rancher用户可以选择使用Rancher Kubernetes Engine(RKE)创建Kubernetes集群,也可以使用GKE,AKS和EKS等云Kubernetes服务。 Rancher用户还可以导入和管理现有的Kubernetes集群。

Rancher支持各类集中式身份验证系统来管理Kubernetes集群。例如,大型企业的员工可以使用其公司Active Directory凭证访问GKE中的Kubernetes集群。IT管​​理员可以在用户,组,项目,集群和云中设置访问控制和安全策略。 IT管​​理员可以在单个页面对所有Kubernetes集群的健康状况和容量进行监控。

Rancher为DevOps工程师提供了一个直观的用户界面来管理他们的服务容器,用户不需要深入了解Kubernetes概念就可以开始使用Rancher。 Rancher包含应用商店,支持一键式部署Helm和Compose模板。Rancher通过各种云、本地生态系统产品认证,其中包括安全工具,监控系统,容器仓库以及存储和网络驱动程序。下图说明了Rancher在IT和DevOps组织中扮演的角色。每个团队都会在他们选择的公共云或私有云上部署应用程序。

优点:

采用图形化方式:易用的Web管理界面,在Docker易用性的基础上,再一次降低了使用容器技术部署容器应用的难度。

支持多种调度器:通过环境模板,很容易地创建和部署Cattle、Swarm、K8S、Mesos容器集群管理调度平台。

管理主机集群:管理对象是多台主机的集群,而不仅仅是单台容器主机,创建和管理几台、几十台应用服务器集群,只需要Ctrl+C、Ctrl+V,复制粘贴就解决了。

内置应用商店:使用其中的WordPress模板,创建一个WordPress博客系统,只需点点鼠标,部署难度不高于申请一个免费的电子邮箱!

资源弹性分配:内置应用负载均衡器,“服务”最小只需1个容器实例,当负载不够/或过剩时,只需点点鼠标,增加/减少“服务”中容器的实例数,即可解决问题,应用系统具有天生的弹性扩容能力。

Docker培训

Docker:

概述:

Docker通过Linux Container技术将任意类型的应用进行包装,由GO语言开发而成,变成一种轻量级的,标准化的,可移植的,自管理的组件。因为这种对应用的包装不仅包装了应用程序本身,更将应用的依赖和环境一并进行打包,所以她允许我们可以将这个包拿到任意环境去运行,提高效率的同时,不再有兼容性的问题。比如:需要将腾讯云上的服务迁移到阿里云,如若使用传统迁移的方法会非常麻烦,但是如果使用docker,则只需要将docker容易迁移到新的服务器上,启动容器即可(一次封装、到处运行);

优势:

1.体积小:减小系统的开销值,一台主机可以运行上千个容器;

2.启动迅捷:更快速的交付和部署,docker容器启动、停止可以实现秒级,比传统虚拟机要快很多,docker核心解决的问题就是利用容器实现VM类似的功能;

3.操作方便:通过配置dockerfile配置文件支持灵活的自动化创建和部署;

4.更轻松的扩展:可以实现更简单的、更可靠的迁移,避免了兼容性等问题;

5.更强的可扩展性和可移植性:

劣势:

1.隔离性:容器虚拟化的隔离性远不及主机级虚拟化,因为多个容器之间共用一个内核空间,是在同一个内核空间进行强行隔离的,而主机级虚拟化是通过多个内核进行统一的隔离;

2.调试工具:传统的服务运行架构是建立在一个内核空间、一个用户空间之上,所有的服务共用一套调试工具,在容器虚拟化中,每个服务运行在一个单独的容器,每个容器就是一个单独的用户空间,那么每个用户空间都需要一套独立的调试工具来管理;

Docker所解决的问题:

核心概念:

1.镜像(Image):创建容器的基础,类似于虚拟机的快照功能,可以理解为一个面向docker容器引擎的只读模板,每个镜像都有一个tag标签,作为其标识;最小的镜像是hello-world镜像,其次是base镜像,如centos系统、ubuntu系统,用户可以根据自己的需求进行对该镜像进行编写,比如:一个镜像可以是一个完整的centos系统,称之为centos镜像;也可以是一个安装了mysql的应用程序,称之为mysql镜像;

镜像的来源可以是一些公网的镜像仓库,如docker hub,下载镜像的过程中会发现,镜像文件是由若干层(Layer)组成,称之为AUFS(联合文件系统),是实现增量保存和更新的基础;

2.容器(Container):基于镜像所创建的实例,可以被启动、停止、删除,多个容器之间互相隔离,互不可见的,可以保证容器的进程隔离性与平台的安全性,也可以把容器看作成为一个简易的linux环境,可以利用容器来部署业务;

3.仓库(Repository):仓库作为docker集中存放镜像的位置,当创建了自己的镜像后,可以使用push命令将镜像上传到公共仓库(public)或者私有仓库(private),这样下次再次使用时,直接从仓库pull下来即可;

仓库注册服务器(registry)是存放仓库的地方,其中包含很多仓库,如果无私有仓库,则使用当前docker最大的公共仓库https://hub.docker.com/,其中存放了数量庞大的镜像供用户下载使用(注:公司harbor服务器就是docker的镜像仓库:https://harbor.raginghot.com.cn/);

基础命令

docker images 查看镜像信息列表 镜像是静态的

docker ps -a 查看运行中的所有容器

docker pull  [images]:[version]从dockerhub拉取指定镜像

docker run -p 8000:80 -tdi –privileged [imageID] [command]  后台启动docker,并指定宿主机端口和docker映射端口。

docker rm [containerID] 删除容器

docker rmi [imageID] 删除镜像

docker cp [YourHostFilePath] [containerID]:[DockerPath]  将宿主机内的指定文件传输至容器内部的指定地址。

镜像制作

创建dockerfile文件(官网编写说明https://docs.docker.com/engine/reference/builder/)

[root@ ~]# cat Dockerfile

FROM docker.io/tomcat

MAINTAINER rstyro

COPY admin.war /usr/local/tomcat/webapps

构建镜像:

# -t 参数 后面跟镜像名字和tag  注意别忘了后面的 . 点表示当前路径

docker build -t 镜像名:版本号 .

Kubernetes培训

K8s:

Kubernetes是一个可移植的,可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes的服务,支持和工具广泛可用。

传统部署时代: 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果,其他应用程序的性能将下降。解决方案是在不同的物理服务器上运行每个应用程序。但这并没有随着资源利用不足而扩展,并且组织维护许多物理服务器的成本很高。

虚拟化部署时代:作为解决方案,引入了虚拟化。它允许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化允许应用程序在VM之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由访问。

虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。借助虚拟化,您可以将一组物理资源呈现为一组一次性虚拟机。

每个VM是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:容器类似于VM,但是它们具有轻松的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻质的。与VM相似,容器具有自己的文件系统,CPU,内存,进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。

容器之所以受欢迎,是因为它们提供了额外的好处,例如:

  • 敏捷的应用程序创建和部署:与使用VM映像相比,容器映像创建的简便性和效率更高。
  • 持续的开发,集成和部署:通过快速简单的回滚(由于图像不可更改),提供可靠且频繁的容器映像构建和部署。
  • 开发和运营的关注点分离:在构建/发布时而不是在部署时创建应用程序容器映像,从而将应用程序与基础架构分离。
  • 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他信号。
  • 跨开发,测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 云和操作系统分发的可移植性:可在Ubuntu,RHEL,CoreOS,本地,Google Kubernetes Engine和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行OS到使用逻辑资源在OS上运行应用程序。
  • 松散耦合,分布式,弹性,解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理–而不是在一台大型单机上运行的整体堆栈。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度

功能:

  • 服务发现和负载平衡
    Kubernetes可以使用DNS名称或使用其自己的IP地址公开容器。如果到容器的流量很高,Kubernetes可以负载平衡并分配网络流量,从而使部署稳定。
  • 存储编排
    Kubernetes允许您自动挂载您选择的存储系统,例如本地存储,公共云提供商等。
  • 自动部署和回滚
    您可以使用Kubernetes描述已部署容器的所需状态,并且可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化Kubernetes来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
  • 自动垃圾箱打包
    您为Kubernetes提供了一个节点集群,可用于运行容器化任务。您告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将容器安装到您的节点上,以充分利用您的资源。
  • 自我修复的
    Kubernetes会重启失败的容器,替换容器,杀死对用户定义的运行状况检查没有响应的容器,并且在准备好服务之前不会将其通告给客户端。
  • 秘密和配置管理
    Kubernetes允许您存储和管理敏感信息,例如密码,OAuth令牌和SSH密钥。您可以部署和更新机密和应用程序配置,而无需重建容器映像,也无需在堆栈配置中公开机密。

主要概念:

Pod:

一组紧密关联的容器集合,支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式完成服务,是Kubernetes调度的基本单位。Pod的设计理念是每个Pod都有一个唯一的IP。

  • 包含多个共享IPC、Network和UTC namespace的容器,可直接通过localhost通信
  • 所有Pod内容器都可以访问共享的Volume,可以访问共享数据
  • 优雅终止:Pod删除的时候先给其内的进程发送SIGTERM,等待一段时间(grace period)后才强制停止依然还在运行的进程
  • 特权容器(通过SecurityContext配置)具有改变系统配置的权限(在网络插件中大量应用)
  • 支持三种重启策略(restartPolicy),分别是:Always、OnFailure、Never
  • 支持三种镜像拉取策略(imagePullPolicy),分别是:Always、Never、IfNotPresent
  • 资源限制,Kubernetes通过CGroup限制容器的CPU以及内存等资源,可以设置request以及limit值
  • 健康检查,提供两种健康检查探针,分别是livenessProbe和redinessProbe,前者用于探测容器是否存活,如果探测失败,则根据重启策略进行重启操作,后者用于检查容器状态是否正常,如果检查容器状态不正常,则请求不会到达该Pod
  • Init container在所有容器运行之前执行,常用来初始化配置
  • 容器生命周期钩子函数,用于监听容器生命周期的特定事件,并在事件发生时执行已注册的回调函数,支持两种钩子函数:postStart和preStop,前者是在容器启动后执行,后者是在容器停止前执行

Namespace:

是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或者用户组。常见的pod、service、replicaSet和deployment等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。

  1. 删除一个namespace会自动删除所有属于该namespace的资源。
  2. default 和 kube-system 命名空间不可删除。
  3. PersistentVolumes是不属于任何namespace的,但PersistentVolumeClaim是属于某个特定namespace的。
  4. Events是否属于namespace取决于产生events的对象。

Node:

Pod真正运行的主机,可以是物理机也可以是虚拟机。Node本质上不是Kubernetes来创建的, Kubernetes只是管理Node上的资源。为了管理Pod,每个Node节点上至少需要运行container runtime(Docker)、kubelet和kube-proxy服务。

Service:

对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。service 有如下四种类型,默认是ClusterIP:

  • ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
  • NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
  • LoadBalancer: 在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort
  • ExternalName: 将服务通过DNS CNAME记录方式转发到指定的域名

另外,也可以将已有的服务以Service的形式加入到Kubernetes集群中来,只需要在创建 Service 的时候不指定Label selector,而是在Service创建好后手动为其添加endpoint。

Ingress:

Kubernetes中的负载均衡我们主要用到了以下两种机制:

Service:使用Service提供集群内部的负载均衡,Kube-proxy负责将service请求负载均衡到后端的Pod中

Ingress Controller:使用Ingress提供集群外部的负载均衡

Service和Pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service所在节点暴露的端口上,然后再由kube-proxy通过边缘路由器将其转发到相关的Pod,Ingress可以给service提供集群外部访问的URL、负载均衡、HTTP路由等,为了配置这些Ingress规则,集群管理员需要部署一个Ingress Controller,它监听Ingress和service的变化,并根据规则配置负载均衡并提供访问入口。

常用的ingress controller:

nginx

traefik

Kong

Openresty

Service Account

Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的

授权

Service Account为服务提供了一种方便的认证机制,但它不关心授权的问题。可以配合RBAC(Role Based Access Control)来为Service Account鉴权,通过定义Role、RoleBinding、ClusterRole、ClusterRoleBinding来对sa进行授权。

Secret 密钥

Sercert-密钥解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中。Secret可以以Volume或者环境变量的方式使用。有如下三种类型:

Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中;

Opaque:base64编码格式的Secret,用来存储密码、密钥等;

kubernetes.io/dockerconfigjson: 用来存储私有docker registry的认证信息。

ConfigMap配置映射

ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件。ConfigMap跟secret很类似,但它可以更方便地处理不包含敏感信息的字符串。ConfigMap可以通过三种方式在Pod中使用,三种分别方式为:设置环境变量、设置容器命令行参数以及在Volume中直接挂载文件或目录。 可以使用 kubectl create configmap从文件、目录或者key-value字符串创建等创建 ConfigMap。也可以通过 kubectl create-f value.yaml 创建。

Prometheus+Grafana监控系统部署

基础环境:

OS:CentOS 7.6/SUSE-11

Docker:18.09.6

Rancher:2.3.3

Prometheus:prometheus:v2.11.1

Grafana:grafana:6.3.4

安装Prometheus+Grafana

Rancher → 应用商店 → Prometheus → 配置端口、启用grafana → 启动

等待镜像下载完成

基础配置:

配置安装的应用名称、使用模板版本、命名空间、使用默认镜像

Prometheus-server配置:

选择服务类型、访问端口、配置持久化

Alertmanager配置:

选择服务类型、访问端口、配置持久化

Grafana配置:

开启grafana Dashboard 、配置用户名密码、持久化及访问端口

Pushgateway配置:

开启 Pushgateway 、配置持久化

被监控端

下载监控指标采集器并后台运行

wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz

tar zxf node_exporter-0.18.1.linux-amd64.tar.gz

nohup ./node_exporter-0.18.1.linux-amd64/node_exporter &

配置prometheus

添加被监控节点

选择“集群”→“项目”→“资源”→“配置映射”→“prometheus-server”→ “升级”

升级 “prometheus-server”

配置节点IP

“prometheus.yml”→“值”→“scrape_configs”→“节点:端口”

– job_name: ‘weblogic’

  static_configs:

  – targets:

    – 192.168.200.7:9256

scrape_configs下插入被监控节点信息

查看节点

查看被监控节点

配置grafana

添加数据源

登录grafana → “Add data source”→“Prometheus”→ 输入prometheus相关信息,保存并测试

“添加数据源”
选择数据源类型“Prometheus”
配置prometheus地址
保存并测试

导入模板

“+”→“import”

导入新模板

导入249模板

输入模板ID

Prometheus告警配置

配置告警规则:

“资源”→“配置映射”→“Prometheus-server”→“升级”→ 输入“值”

groups:

– name: memalert     ##告警规则组组名

  rules:

  – alert: NodeMemoryUsage  ##告警名称

    expr: (node_memory_MemTotal_bytes – (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 50    ##触发规则

    for: 1m                               ##持续时间

    annotations:                           ##告警通知

      summary: “{{$labels.instance}}: High Memory usage detected”

      description: “{{$labels.instance}}: Memory usage is above 80% (current value is:{{ $value }})”

添加新的配置映射为告警规则文件

指定告警规则文件

rule_files:

– /etc/config/memory_over.yml

“prometheus.yml”中配置规则文件

钉钉告警:

“资源”→“配置映射”→“prometheus-alertmanager”→“升级”→ 输入“值”

global:                 ##全局配置

  resolve_timeout: 5m    ##告警恢复通知时间

route:

  group_by: [‘job’]

  group_wait: 30s

  group_interval: 5m     ##新告警发送等待时间

  repeat_interval: 1h     ##重复告警发送间隔

  receiver: webhook

receivers:                   ##接收器

– name: ‘webhook’      ##接收器名称

  webhook_configs:    

  – url: ‘http://webhook-dingtalk.prometheus.svc.cluster.local:8060/dingtalk/webhook1/send’   ##webhook-svc地址

    send_resolved: true

安装webhook

[root@prometheus_master ~]# cat dingtalk-webhook.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: webhook-dingtalk

  namespace: prometheus

  labels:

    run: dingtalk

spec:

  replicas: 1

  selector:

    matchLabels:

        run: dingtalk

  template:

    metadata:

      labels:

        run: dingtalk

    spec:

      containers:

      – name: dingtalk

        image: timonwong/prometheus-webhook-dingtalk:v0.3.0

        imagePullPolicy: IfNotPresent

        args:

          – –ding.profile=webhook1=https://oapi.dingtalk.com/robot/send?access_token=907262bedac6e948801c7810b86415a88ec02db3fb1ffcd0010ebdf8ea0de157     ##钉钉机器人token

        ports:

        – containerPort: 8060

          protocol: TCP

apiVersion: v1

kind: Service

metadata:

  labels:

    run: dingtalk

  name: webhook-dingtalk

  namespace: prometheus

spec:

  ports:

  – port: 8060

    protocol: TCP

    targetPort: 8060

  selector:

    run: dingtalk

  sessionAffinity: None

[root@prometheus_master ~]# kubectl apply -f dingtalk-webhook.yaml

邮件告警:

“资源”→“配置映射”→“prometheus-alertmanager”→“升级”→ 输入“值”

global:

  smtp_smarthost: ‘smtp.163.com:25’

  smtp_from: ‘shij_yu@163.com’

  smtp_auth_username: ‘shij_yu@163.com’

  smtp_auth_password: ‘raging2454’

  smtp_require_tls: false

route:

  group_by: [‘alertname’]

  repeat_interval: 1m

  receiver: live-monitoring

receivers:

– name: ‘live-monitoring’

  email_configs:

  – to: ‘704156648@qq.com’

企业微信告警:

“资源”→“配置映射”→“prometheus-alertmanager”→“升级”→ 输入“值”

global:

  resolve_timeout: 5m

  wechat_api_corp_id: ‘wwf4589b498bb9c8fb’

  wechat_api_url: ‘https://qyapi.weixin.qq.com/cgi-bin/’

  wechat_api_secret: ‘gHFsTuw92GOHN0GJdDf6KLOSXUOWaR4fwicDbV9k2FI’

route:

  group_by: [‘alertname’]

  group_wait: 10s

  group_interval: 10s

  repeat_interval: 1h

  receiver: ‘wechat’

receivers:

– name: ‘wechat’

  wechat_configs:

  – send_resolved: true

    to_party: ‘1’

    agent_id: 1000002

    corp_id: ‘wwf4589b498bb9c8fb’

    api_url: ‘https://qyapi.weixin.qq.com/cgi-bin/’

    api_secret: ‘gHFsTuw92GOHN0GJdDf6KLOSXUOWaR4fwicDbV9k2FI’

告警测试

测试方案

配置一条内存告警规则,告警接收方为企业微信、钉钉、email,把内存告警的触发值调低到1%,查看是否能接收到告警消息

测试结果

钉钉告警:

企业微信:

邮箱告警: