0%

Logback默认配置的步骤

  1. 尝试在 classpath下查找文件logback-test.xml;
  2. 如果文件不存在,则查找文件logback.xml;
  3. 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。

logback配置文件模板

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <property name="ROOT" value="./logs/" />
    <property name="FILESIZE" value="100MB" />
    <property name="MAXHISTORY" value="30" />
    <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
    <!-- 控制台打印 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %logger{36} - %m%n</pattern>
        </encoder>
    </appender>
    <!-- 输入到文件,按日期和文件大小 -->
    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %logger{36} - %m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${ROOT}/log.%d.%i.log</fileNamePattern>
            <maxHistory>${MAXHISTORY}</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${FILESIZE}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>
    <!-- Logger 根目录 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILEOUT" />
    </root>
</configuration>

本文使用的istio版本号:1.4.2

配置安装kiali

默认配置,istio并未选择安装kiali,参考上一章安装,修改values.yaml

vim install/kubernetes/helm/istio/values.yaml
# ....
kiali:
  enabled: true
# ....

同时如果需要链路监控,需要开启安装jaeger

#....
tracing:
  enabled: true
#....

如果系统中没有安装grafanaPrometheus,也需要开启

#.....
grafana:
  enabled: true
 
prometheus:
  enabled: true
#.....

配置kiali

可以在安装前配置好kaili,主要配置集中在

vim install/kubernetes/helm/istio/charts/kiali/values.yaml
#......
ingress:
  enabled: false
  hosts:
    - kiali.local
 
dashboard:
  auth:
    strategy: login
  secretName: kiali 
  viewOnlyMode: false 
  grafanaURL:  
  jaegerURL:  
prometheusAddr: http://prometheus:9090
#.....
  • 配置访问:ingress是否开启,hosts地址,tls…
  • strategy:认证策略,可以是anonymous, login, openshift,默认login
  • secretName:登录用户名/密码,需要提前创建好secret
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  labels:
    app: kiali
    version: v1.9
type: Opaque
data:
  username: YWRtaW4=    # admin
  passphrase: YWRtaW4=    # admin
#base64 加密
echo -n "admin" | base64
  • grafanaURL:grafana地址,如果是在同一个namespace下,可以是
http://grafana:3000 或者 http://grafana.monitoring.svc.cluster.local:3000
  • prometheusAddr:Prometheus地址,如果是在同一个namespace下,可以是
http://prometheus:9090 或者 http://prometheus.monitoring.svc.cluster.local:9090
  • jaegerURL:jaeger地址,默认在同一个namespace istio-system下,可以是
http://jaeger-query:16686/jaeger

如果是在安装后,想要修改kiali配置,可以修改istio-systemconfigmap kiali

kubectl edit cm  kiali   -n istio-system

修改configmap里面的config.yaml文件,对应的

istio_namespace: istio-system
deployment:
  accessible_namespaces: ['**']
auth:
  strategy: login
server:
  port: 20001
  web_root: /kiali
external_services:
  tracing:
    url: http://jaeger-query:16686/jaeger
  grafana:
    url: http://grafana:3000
  prometheus:
    url: http://prometheus:9090

修改完需要重启kiali POD

预览

istio

本文使用的istio版本号:1.4.2

简介(参考官网,Naftis小米开源,不在维护)

Naftis 是一个基于 web 的 Istio dashboard,通过任务模板的方式来帮助用户更方便地执行 Istio 任务。 用户可以在 Naftis 中定义自己的任务模板,并填充变量来构造单个或多个构造任务实例,从而完成各种服务治理功能。

  • 内部集成了一些常用 dashboard
  • 可定制的任务模板支持
  • 支持回滚指定任务
  • 支持指定根服务节点的服务拓扑图
  • 提供查看 Istio 的 Services 和 Pod 的支持
  • 开箱即用,通过 Kubectl 相关指令即可快速部署
  • 支持 Istio 1.0

快速安装

# 下载最新 release 文件和部署清单
wget -O - https://raw.githubusercontent.com/XiaoMi/naftis/master/tool/getlatest.sh | bash
 
# 创建 Naftis 命名空间
$ kubectl create namespace naftis
 
# 确认 Naftis 命名空间已创建
$ kubectl get namespace naftis
NAME           STATUS    AGE
naftis         Active    18m
 
# 部署 Naftis MySQL 服务(本地 Kuberenetes 集群)
$ kubectl apply -n naftis -f mysql.yaml
# 部署 Naftis MySQL 服务(云服务商提供的 Kuberenetes 集群)
$ kubectl apply -n naftis -f mysql-cloud.yaml
 
# 确认 MySQL 已部署
NAME                           READY     STATUS    RESTARTS   AGE
naftis-mysql-c78f99d6c-kblbq   0/1       Running   0          9s
naftis-mysql-test              1/1       Running   0          10s
 
# 部署 Naftis API 和 UI 服务
kubectl apply -n naftis -f naftis.yaml
 
# 确认 Naftis 所有的服务已经正确定义并正常运行中
kubectl get svc -n naftis
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
naftis-api     ClusterIP      10.233.3.144            50000/TCP      7s
naftis-mysql   ClusterIP      10.233.57.230           3306/TCP       55s
naftis-ui      LoadBalancer   10.233.18.125        80:31286/TCP   6s
 
kubectl get pod -n naftis
NAME                           READY     STATUS    RESTARTS   AGE
naftis-api-0                   1/2       Running   0          19s
naftis-mysql-c78f99d6c-kblbq   1/1       Running   0          1m
naftis-mysql-test              1/1       Running   0          1m
naftis-ui-69f7d75f47-4jzwz     1/1       Running   0          19s
 
# 端口转发访问 Naftis
kubectl -n naftis port-forward $(kubectl -n naftis get pod -l app=naftis-ui -o jsonpath='{.items[0].metadata.name}') 8080:80 &
 
# 打开浏览器,访问 http://localhost:8080 即可。默认用户名和密码分别为 admin、admin。

预览

naftis

安装比较简单,功能也比较简单。

本文使用的istio版本:1.4.2

查看默认sidecar配置

kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml | grep "namespaceSelector:" -A5
 
  namespaceSelector:
    matchLabels:
      istio-injection: enabled
  objectSelector: {}
  reinvocationPolicy: Never
  rules:

可以看出,istio默认sidecar注入规则是,namespace带有标签istio-injection: enabled才会注入sidecar。

查看哪些namespace已经配置注入:

[root@k8s-master istio-1.4.2]# kubectl get namespace -L istio-injection
NAME              STATUS   AGE   ISTIO-INJECTION
default           Active   70d   
ingress-nginx     Active   69d   
istio-system      Active   19h   
kube-node-lease   Active   70d   
kube-public       Active   70d   
kube-system       Active   70d   
naftis            Active   19h   
test-deri         Active   47d 

namespace打上注入sidecar标签:

kubectl label namespace default istio-injection=enabled --overwrite

默认情况,是没有设置。

为namespace设置不注入sidecar

有些k8s系统组件namespace不应该注入sidecar,如kube-system等,参考如下设置

kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml | grep "namespaceSelector:" -A5
 
  namespaceSelector:
    matchExpressions:
    - key: istio-injection
      operator: NotIn
      values:
      - disabled
  rules:
  - apiGroups:
    - ""

namespace打上不注入sidecar标签:

kubectl label namespace istio-system istio-injection=disabled --overwrite
kubectl get namespace -L istio-injection
NAME           STATUS    AGE       ISTIO-INJECTION
default        Active    18d
istio-system   Active    3d        disabled
kube-public    Active    18d       disabled
kube-system    Active    18d       disabled

查看sidecar配置策略

sidecar配置保存在configmap-istio-sidecar-injector中,更多配置可以在install/kubernetes/helm/istio/charts/sidecarInjectorWebhook/values.yaml中查看。

主要配置,默认策略:

kubectl -n istio-system get configmap istio-sidecar-injector -o jsonpath='{.data.config}' | grep policy:

允许的值为disabledenabled。仅当Webhook namespaceSelector匹配目标名称空间时,才应用默认策略。无法识别的策略导致注入被完全禁用。

注意:①策略为disabled,但是想要为POD注入sidecar,增加annotation sidecar.istio.io/inject: "true"即可
  ②策略为enabled,但是不想要为POD注入sidecar,增加annotation sidecar.istio.io/inject: "false"即可

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ignored
spec:
  template:
    metadata:
      annotations:
        sidecar.istio.io/inject: "false"
    spec:
      containers:
      - name: ignored
        image: tutum/curl
        command: ["/bin/sleep","infinity"]

手动注入sidecar

为一个写好的yaml文件手动注入sidecar,我们可以使用istioctl kube-inject:

istioctl kube-inject -f samples/sleep/sleep.yaml | kubectl apply -f -

默认情况下,这将使用集群内配置。或者,可以使用配置的本地副本来完成注入。下面命令可以将默认配置导出到文件:

kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.config}' > inject-config.yaml
kubectl -n istio-system get configmap istio-sidecar-injector -o=jsonpath='{.data.values}' > inject-values.yaml
kubectl -n istio-system get configmap istio -o=jsonpath='{.data.mesh}' > mesh-config.yaml

然后再将文件中配置注入到已建好的YAML中并运行:

istioctl kube-inject \
    --injectConfigFile inject-config.yaml \
    --meshConfigFile mesh-config.yaml \
    --valuesFile inject-values.yaml \
    --filename samples/sleep/sleep.yaml \
    | kubectl apply -f -

这和第一条命令效果一样。验证sidecar已经注入:

kubectl get pod  -l app=sleep
NAME                     READY   STATUS    RESTARTS   AGE
sleep-64c6f57bc8-f5n4x   2/2     Running   0          24s

其它配置:neverInjectSelector/alwaysInjectSelector

参考官网

示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: istio-sidecar-injector
data:
  config: |-
    policy: enabled
    neverInjectSelector:
      - matchExpressions:
        - {key: openshift.io/build.name, operator: Exists}
      - matchExpressions:
        - {key: openshift.io/deployer-pod-for.name, operator: Exists}
    template: |-
      initContainers:
...

配置优先级

如果POD配置了注解neverInjectSelector/alwaysInjectSelector也都配置了,默认策略也配置了,那么他们之间的优先级参考如下:

Pod Annotations → NeverInjectSelector → AlwaysInjectSelector → Default Policy

卸载自动注入sidecar

卸载istio中sidecar组件

kubectl delete mutatingwebhookconfiguration istio-sidecar-injector
kubectl -n istio-system delete service istio-sidecar-injector
kubectl -n istio-system delete deployment istio-sidecar-injector
kubectl -n istio-system delete serviceaccount istio-sidecar-injector-service-account
kubectl delete clusterrole istio-sidecar-injector-istio-system
kubectl delete clusterrolebinding istio-sidecar-injector-admin-role-binding-istio-system

删除某个namespace自动注入

kubectl label namespace default istio-injection-

sidecar注入问题

更多可以参考官网.

本文使用的版本号:1.4.2

自定义安装组件

参考安装页面,官网给配置分了几个级别,

istio

分别代表:

  • default:根据IstioControlPlaneAPI的默认设置启用组件 (建议用于生产部署)。您可以通过运行命令显示默认设置istioctl profile dump。
  • demo:旨在展示Istio功能且资源需求适中的配置。适合运行Bookinfo应用程序和相关任务。这是随快速入门说明一起安装的配置,但是 如果您想探索更高级的任务,则可以稍后自定义配置以启用其他功能。

    此配置文件可实现高级别的跟踪和访问日志记录,因此不适合进行性能测试。

  • minimal:使用Istio的流量管理功能所需的最少组件集。
  • sds:类似于默认配置文件,但也启用Istio的SDS(​​秘密发现服务)。此配置文件附带默认情况下启用的其他身份验证功能(严格双向TLS)。
  • remote:用于配置共享控制平面的多集群服务网格multicluster mesh。

不同配置安装的的组件也不一样,参考配置,打X是要安装的
istio

当然我们也可以自定义安装组件

cd install/kubernetes/helm/istio
vim values.yaml
gateways:
  enabled: true
 
sidecarInjectorWebhook:
  enabled: true
 
galley:
  enabled: true
 
mixer:
  policy:
    enabled: true
 
  telemetry:
    enabled: true
 
pilot:
  enabled: true
 
security:
  enabled: true
 
nodeagent:
  enabled: false
 
grafana:
  enabled: false
 
prometheus:
  enabled: true
 
tracing:
  enabled: false
 
kiali:
  enabled: false
 
certmanager:
  enabled: false
 
istio_cni:
  enabled: false
 
istiocoredns:
  enabled: false
 
# ...

可以将我们需要安装的组件定义为true之后,参考部署再安装。

所有的配置说明参考官网配置选项.

准备工作

下载istio

下载页面,下载与您的操作系统相对应的安装文件。Linux上可以直接执行下面命令下载并解压最新版

curl -L https://istio.io/downloadIstio | sh -

移至Istio软件包目录

例如,如果软件包为 istio-1.4.2

cd istio-1.4.2

安装目录包含:

  • Kubernetes的安装YAML文件在 install/kubernetes
  • 示例应用程序 samples/
  • 目录中的客户端二进制文件。手动注入Envoy作为Sidecar代理时使用。istioctlbin/istioctl
  • istioctl命令添加到环境变量,如下命令是临时加入
export PATH=$PWD/bin:$PATH

两种安装方式

istio在kubenetes上有两种安装方式,参考官网

helm template方式安装Istio

创建namespace

kubectl create namespace istio-system

安装所有istio的CRD

先将template导出到istio.yaml

helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system > istio.yaml

然后执行

kubectl apply -f istio.yaml

或者,两个步骤合二为一

helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -

等待所有CRD创建完毕

kubectl -n istio-system wait --for=condition=complete job --all

使用默认配置安装isito,其它配置参考官网,同上,命令也可以分开执行

helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -

helm install方式安装Istio

为Tiller创建service-account,如果已安装好Tiller直接跳过。

kubectl apply -f install/kubernetes/helm/helm-service-account.yaml

安装Tiller,如果已安装好Tiller直接跳过。

helm init --service-account tiller

安装istio-init,其中包括了创建istio的CRDs。

helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system

等待CRD创建完成。

kubectl -n istio-system wait --for=condition=complete job --all

使用默认配置安装istio,其它配置参考官网

helm install install/kubernetes/helm/istio --name istio --namespace istio-system

确定安装完成

kubectl get svc -n istio-system
kubectl get pods -n istio-system

卸载Istio

使用helm template安装方式卸载

helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
 
kubectl delete namespace istio-system

使用helm install安装方式卸载

helm delete --purge istio
helm delete --purge istio-init
helm delete --purge istio-cni
kubectl delete namespace istio-system

删除CRDs

kubectl delete -f install/kubernetes/helm/istio-init/files

以上就是通过默认配置安装和卸载istio。