0%

使用国内镜像源。

quay.io

例如下面拉取比较慢

docker pull quay.io/jetstack/cert-manager-cainjector:v0.12.0

可以换成

docker pull quay-mirror.qiniu.com/jetstack/cert-manager-cainjector:v0.12.0

gcr.io

例如下面拉取比较慢

docker pull gcr.io/google_containers/kube-proxy

可以换成阿里云的

docker pull registry.aliyuncs.com/google_containers/kube-proxy

下载完成

可以使用tag命令改回去

docker tag 

kubernetes在删除namespace时,或多或少出现过删除后一直处于Terminating状态,这时又该如何删除呢?
本文介绍各种手段删除处于Terminating状态的namespace

一般删除

kubectl delete namespace NAMESPACENAME

强制删除

kubectl delete namespace NAMESPACENAME --force --grace-period=0

删除finalizers

修改namespace配置,删除红色框中内容

kubectl edit namespace NAMESPACE_NAME

NAMESPACE

调用接口删除

也有可能,上述方法中没有看到finalizers,这时可以通过调用接口的方式删除

  • 第一步:将namespace内容导出到tmp.json文件中:
kubectl get namespace NAMESPACE_NAME -o json > tmp.json
  • 第二步:修改tmp.json内容,删除json中以下内容:
{
    //删除spec整个内容
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
    
    "status": {
        "phase": "Terminating"
    }
}
  • 第三步:开启k8s接口代理,新开一个窗口,执行
[root@k8s-master ~]# kubectl proxy
Starting to serve on 127.0.0.1:8001
  • 第四步:调用接口删除Namespace,注意URL中修改成要删除的NAMESPACE_NAME
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/NAMESPACE_NAME/finalize

本文使用istio版本号:1.4.2

Istio安装时,第一步就是创建了各种自定义资源类型(CRD),参考istio部署【在kubernetes上部署】,其中最重要的几个CRD包括:GatewayVirtualServiceDestinationRuleServiceEntry。主要架构如下图:
CRDs

DestinationRule

DestinationRule用于定义目标服务的访问策略,如在subset定义版本,定义负载均衡策略,熔断,一级TLS等。

基本示例

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

定义负载均衡策略

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN

定义熔断器

参考官网

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
    trafficPolicy:
      connectionPool:
        tcp:
          maxConnections: 100
      http:
        http1MaxPendingRequests: 100
        maxRequestsPerConnection: 100
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100

VirtualService

VirtualService是最重要的配置接口,定义服务的所有路由规则,包括条件判断、权重、路径重写等。

定义权重示例

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 90
    - destination:
        host: reviews
        subset: v2
      weight: 10

定义超时和重试策略

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
    - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    timeout: 10s
    retries:
      attempts: 3
      perTryTimeout: 2s

故障注入:模拟失败的场景

参考Fault Injection

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      #定义10%请求+5秒延迟, 也可以是percent: 10
      delay:
        percentage:
          value: 10
        fixedDelay: 5s
 
      #定义10%请求返回400错误, 也可以是percent: 10
      abort:
        percentage:
          value: 10
        httpStatus: 400
    route:
    - destination:
        host: ratings
        subset: v1

条件判断——标签

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - sourceLabels:
        app: reviews
        version: v2
    ...

条件判断——Header

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2

条件判断——URI路径

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
    - productpage
  http:
  - match:
    - uri:
        prefix: /api/v1
    ...

多条件判断

如果是嵌套在一个匹配语句中,为AND关系。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - sourceLabels:
        app: reviews
        version: v2
      headers:
        end-user:
          exact: jason
    ...

如果是单独的匹配语句,为OR关系。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - sourceLabels:
        app: reviews
        version: v2
    - headers:
        end-user:
          exact: jason
    ...

ServiceEntry

将外部服务接入到服务注册表中,让Istio中自动发现的服务能够访问和路由到这些手工加入的服务。与VirtualServiceDestinationRule配合使用。

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: foo-ext-svc
spec:
  hosts:
  - *.foo.com
  ports:
  - number: 80
    name: http
    protocol: HTTP
  - number: 443
    name: https
    protocol: HTTPS
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bar-foo-ext-svc
spec:
  hosts:
    - bar.foo.com
  http:
  - route:
    - destination:
        host: bar.foo.com
    timeout: 10s

Gateway

提供外部服务访问接入,可发布任意内部端口的服务,供外部访问。配合VirtualService使用。

Bookinfo示例:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

docker镜像导入导出有两种方式

  • export/import
  • load/save

export/import

docker export -o "导出的镜像文件名.tar" CONTATINER

docker import "导出的镜像文件名.tar" "镜像名:版本号"

load/save

docker load --input "导出的镜像文件名.tar"

docker save -o "导出的镜像文件名.tar" "要导出的镜像名"

有时候需要在启动POD前,修改POD内核相关参数,除了使用initContainer还可以使用sysctl
参考链接Using sysctls in a Kubernetes Cluster

apiVersion: v1
kind: Pod
metadata:
  name: sysctl-example
spec:
  securityContext:
    sysctls:
    - name: kernel.shm_rmid_forced
      value: "0"
    - name: net.core.somaxconn
      value: "1024"
    - name: kernel.msgmax
      value: "65536"
  ...

了解 DevOps

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

DevOps简介

DevOps 就是开发(Development)、测试(QA)、运维(Operations)这三个领域的合并。
DevOps

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

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

容器与 DevOps 有什么关系?

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

DevOps 与 CI/CD

选择支持流程的工具对于 DevOps 的成功至关重要。运维团队要跟上快速开发周期,就需要利用高度灵活的平台,并像开发团队对待代码一样,对待平台的基础架构。手动部署不仅速度慢,而且可能出错。因此,您也可通过自动化来简化平台调配和部署。

持续集成和持续部署管道(CI/CD)是实施 DevOps 的一大重要成果。CI/CD 可帮助您频繁地向客户交付应用并检验软件质量,而且只需极少的人工干预。

具体而言,CI/CD 在整个应用生命周期内(从集成和测试阶段,到交付和部署)都引入了持续自动化和持续监控,让您能够快速识别和改正问题与缺陷。这些彼此关联的实践通常被统称为“CI/CD 管道”,需要开发和运维团队以敏捷方式协同支持。

CICD简介

  • 持续集成(Continuous Integration ,CI)
  • 持续交付(Continuous Delivery)
  • 持续部署(Continuous Deploy)

参考链接

云原生CICD实现

CICD
流程:

  1. 用户本地完成开发;
  2. 代码提交到GitLab上;
  3. Gitlab收到代码提交请求后通过webhook触发Jenkins;
  4. Jenkins被触发后,首先从代码仓库拉取源码,进行构建、静态分析和单元测试,然后创建镜像推送到镜像仓库Harbor,最后调用Kubernetes API更新应用;
  5. Kubernetes从Harbor拉取最新镜像,更新应用。