yaml notes


Kubernetes

请看文档:https://www.kubernetes.org.cn/k8s

Kubernetes (通常称为 K8s) 是开源容器集群管理系统,用于自动部署、扩展和管理容器化 应用程序。

Rancher 示范
sudo docker run -itd --privileged --restart=unless-stopped -p 8080:80 -p 8443:443 -v /home/cyy/rancher:/var/lib/rancher/  -e CATTLE_AGENT_IMAGE="registry.cn-hangzhou.aliyuncs.com/rancher/rancher-agent:v2.4.8" registry.cn-hangzhou.aliyuncs.com/rancher/rancher:v2.4.8
nginx and alpine
nginx:1.18-alpine

docker pull alpine:3.12

docker run  -d  --name tt \
-v /home/cyylog/myweb:/app \
-w /app \
-p 8081:80 \
alpine:3.12 \
./myserver
Redis
第一步:首先创建文件夹

[cyy@cyylog1 n1]$ tree /home/cyy/redis
/home/cyy/redis
├── n1
│   ├── conf
│   │   └── redis.conf
│   ├── data            (用来存放数据目录)
│   └── logs            (用来存放日志)
└── redis.conf


 其中配置文件中
daemonize no (不以守护进程启动)
port 6379
bind 0.0.0.0
logfile /logs/redis.log   (日志文件)
dir /data   (数据目录)

第二步:在Nfs服务器上export 文件夹
 sudo vi /etc/exports
加入如下一行:
在  /home/cyylog/redis    192.168.0.0/24(rw,async,insecure,no_root_squash)
然后执行 exportfs -a  
或(sudo systemctl restart nfs.service)
重新加载配置


redis镜像
我们还是使用redis:5-alpine

为了速度,大家可以提前pull下来
docker pull redis:5-alpine


映射
映射
n1/conf:/conf
n1/data:/data
n1/logs:/logs

注意:n1 是 子目录  前面不要加 /


启动命令
redis-server /conf/redis.conf
registry

镜像地址:https://hub.docker.com/_/registry

基本运行
docker run  -d --name registry \
 -v /home/cyy/registry/config.yml:/etc/docker/registry/config.yml \
 -v /home/cyy/registry/data:/var/lib/registry \
-p 5000:5000   registry 

也可以直接 用k8s 安装一个单机的 容器


配置文件

version: 0.1
log:
 fields:
 service: registry
storage:
 delete:
  enabled: true
 cache:
  blobdescriptor: inmemory
 filesystem:
  rootdirectory: /var/lib/registry
http:
 addr: :5000
 headers:
  X-Content-Type-Options: [nosniff]
health:
 storagedriver:
 enabled: true
 interval: 10s
 threshold: 3


测试
找个已经有的镜像,打个tag
docker tag  redis:5-alpine  192.168.0.129:5000/redis:v1
传到我们的私有镜像里
 docker push 192.168.0.129:5000/redis:v1
sha256:9e0926fe90cef2fc4e435fbcb63c273d34ac9b05de6545cb92d708ccdb7f823f 

查看API(https://docs.docker.com/registry/spec/api/#listing-repositories)
curl http://192.168.0.129:5000/v2/_catalog   (查看列表)
curl http://192.168.0.129:5000/v2/redis/manifests/v1   (查看redis镜像详情)
curl http://192.168.0.129:5000/v2/redis/tags/list
curl -X DELETE http://192.168.0.129:5000/v2/redis/manifests/xxx
垃圾回收:registry garbage-collect /etc/docker/registry/config.yml 


设置安全
不出意外会报一个 错误http: server gave HTTP response to HTTPS client

那是因为docker为了安全,需要https 。但是我们可以让其不需要

  要修改的是/etc/docker/daemon.json
{
    "insecure-registries":["192.168.0.129:5000"]
}

然后重载docker 即可systemctl  reload docker

下载镜像
docker pull 192.168.0.129:5000/redis:v1
​~~~##### CI/CD

###### 搭建`gitlab`

​~~~shell
docker pull gitlab/gitlab-ce

创建专属pv
 sudo vi /etc/exports
加入一行 
/home/cyy/gitlab    192.168.0.129/24(rw,async,insecure,no_root_squash)
然后执行 sudo exportfs -a 重新加载配置

[cyy@cyylog1 gitlab]$ pwd   # 的子目录
/home/cyy/gitlab
[cyy@cyylog1 gitlab]$ tree .
.
├── config
├── data
└── logs


挂载内容

/etc/gitlab       config
/var/opt/gitlab data
/var/log/gitlab logs


配置负载均衡时 别忘了加:
nginx.ingress.kubernetes.io/rewrite-target

使用gitlab

请各位通过百度查询  自行生成生成SSH key

并通过如下测试:
ssh -T git@git.cyylog.cn -p 30022    (注意 ,这有个端口,22被主机的SSH占用了,你懂的)
ssh-keygen -t rsa -C "cyylog@163.com"
项目中执行
1、git init 
2、  
git config --global user.name "cyylog"
git config --global user.email "cyylog@163.com"


先pull下来
注意:最终的地址是这样的
   ssh://git@git.cyylog.cn:30022/cyylog/mygo.git

git pull origin master --allow-unrelated-histories
gitlab-runner
随便找台机器 执行
   docker pull gitlab/gitlab-runner

 然后创建一个文件夹 /home/cyy/gitlab-runner
docker run -d --name gitlab-runner   \
  -v /home/cyy/gitlab-runner:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner

接下来执行 
docker exec -it gitlab-runner  gitlab-runner register

# vi .gitlab-ci.yml
stages:
  - test
  - build
job1:
  stage: test
  script:
    - echo "it is test"

job2:
  stage: build
  script:
    - echo "it is build"

各种参数

script             由Runner执行的Shell脚本。
image              使用docker镜像,  image:name
service            使用docker  services镜像, services:name
before_script      执行作业前运行的脚本
after_script       作业完成后运行的脚本
stages             定义管道中的步骤,依次运行
stage              定义管道中步骤的作业段
only              指定作业限制only:refs,only:kubernetes,only:variables,和only:changes
tags               指定执行作业的runner
allow_failure      允许job失败


when               什么时候开始工作,
  on_success       只有当前一个阶段的所有工作都成功时(或者因为它们被标记而被认为是成功的allow_failure)才执行工作 。这是默认值。
  on_failure       仅当前一阶段的至少一个作业失败时才执行作业。
  always           无论先前阶段的工作状态如何,都可以执行工作。
  manual           手动执行作业
  delayed          延迟作业。后面跟start_in,start_in 30minutes(延迟30分钟),不加单位,默认为秒。最长可延迟1小时。
environment     作业部署到的环境名称   #暂未搞清

 cache    
  key:"$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" #为每分支,每步骤启用缓存
artifacts         job成功时附加到作业的文件或目录
dependencies      此job依赖其他jobz,主要作用于作业优先级
converage         给定作业代码覆盖率设置       
retry             在发生故障时,可以自动重试作业的次数。
parallel        应该并行运行多少个作业实例
trigger          定义下游管道触发器
include          允许此作业包含外部YAML
extends          此作业将继承的配置项
pages            上传作业结果用于gitlab pages
variables        作业级别定义作业变量
编译Go程序、打包镜像
把上面的容器删掉  
 centos7 (阿里云)
docker run -d --name gitlab-runner   \
  -v /home/cyylog/gitlab-runner:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
 -v /usr/bin/docker:/usr/bin/docker \ 
 -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7  \
  gitlab/gitlab-runner

并在宿主机上执行 :chmod 666 /var/run/docker.sock


stages:
  - test
job1:
  stage: test
  script:
    - docker build -t mygo:v1  .
  tags:
    - go


Docker file

FROM golang:1.14.4-alpine3.12
RUN mkdir /src /app

ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o ../app/mygo main.go && cd /app && chmod +x mygo && cd /
RUN rm src -fr
WORKDIR /app
ENTRYPOINT  ["/app/mygo"]
打包Go镜像、瘦身镜像
新的 Dockerfile

FROM golang:1.14.4-alpine3.12
RUN mkdir /src /app

ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o ../app/mygo main.go && cd /app && chmod +x mygo && cd /

FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /app/mygo /app
ENTRYPOINT ["/app/mygo"]
打包Go镜像、加入单元测试

编辑 .gitlab-ci.yml

stages:
  - test
  - build
GoTest:
  stage: test
  script:
    - docker build -f DockerfileTest -t test-mygo:v1 .
    - docker run --rm test-mygo:v1
  after_script:
    - docker rmi test-mygo:v1
  tags:
    - go

GoBuild:
  stage: build
  script:
    - docker build -t mygo:v1  .
  after_script:
    - docker rmi $(docker images -af "dangling=true" -q)
  tags:
    - go

Dockerfile

FROM golang:1.14.4-alpine3.12
RUN mkdir /src

ADD . /src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o mygo main.go  && chmod +x mygo


FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /src/mygo /app
ENTRYPOINT  ["/app/mygo"]

DockerfileTest

FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
cmd ["go","test"]
打包Go镜像、发布到私有镜像库

编辑 .gitlab-ci.yml 添加deploy

GoDeploy:
  stage: deploy
  script:
    - docker tag  mygo:v1  192.168.0.129:5000/mygo:v1
    - docker push 192.168.0.129:5000/mygo:v1
  after_script:
    - docker rmi 192.168.0.129:5000/mygo:v1
    - docker rmi mygo:v1
  tags:
    - go

Dockerfile

FROM golang:1.14.4-alpine3.12
RUN mkdir /src
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add build-base
ADD . /src
RUN cd /src && ls && GOPROXY=https://goproxy.cn go build -o mygo main.go  && chmod +x mygo


FROM alpine:3.12
RUN mkdir /app
COPY --from=0 /src/mygo /app
ENTRYPOINT  ["/app/mygo"]

DockerfileTest

FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
ENV GOPROXY=https://goproxy.cn
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add build-base
cmd ["go","test"]

查看仓库

curl http://192.168.0.129:5000/v2/_catalog   (查看列表)
curl http://192.168.0.129:5000/v2/镜像名/manifests/v1   (查看redis镜像详情)
curl http://192.168.0.129:5000/v2/mygo/tags/list
打包镜像、自动更新服务

修改runner

docker run -d --name gitlab-runner   \
  -v /home/cyy/gitlab-runner:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
 -v /usr/bin/docker:/usr/bin/docker \
 -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7  \
-v /usr/local/bin/kubectl:/usr/local/bin/kubectl \
-v /home/cyy/kubectlconfig/config:/kubeconfig \
-e KUBECONFIG=/kubeconfig \
  gitlab/gitlab-runner

(请自行删除容器后 重新创建)

熟悉以下命令


1、kubectl get pod -n myweb| grep mygo

2、kubectl get pod -n myweb| grep mygo | awk '{print $1}'

3、 kubectl get pod -n myweb| grep mygo | awk '{print $1}'  | xargs kubectl delete pod -n myweb

加入配置 .gitlab-ci.yml

GoPub:
  stage: publish
  script:
    - kubectl get pod -n myweb| grep mygo | awk '{print $1}'  | xargs kubectl delete pod -n myweb
  tags:
    - go
灰度发布

那么现在我们要干的事 是设置 一部分流量

添加这个标签

nginx.ingress.kubernetes.io/canary-weight

设置如下标签

 Nginx –Ingress ,支持配置 标签来实现不同场景下的灰度发布和测试。  

主要使用如下标签
nginx.ingress.kubernetes.io/canary   
nginx.ingress.kubernetes.io/canary-by-header
nginx.ingress.kubernetes.io/canary-by-header-value
nginx.ingress.kubernetes.io/canary-weight
nginx.ingress.kubernetes.io/canary-by-cookie

3步一键创建services

pub.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mygo
  namespace: myweb
spec:
  selector:
    matchLabels:
      app: mgo
  replicas: 1
  template:
    metadata:
      labels:
        app: mgo
    spec:
      containers:
        - name: mygo
          image: 192.168.0.129:5000/mygo:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: mygo-service
  namespace: myweb
spec:
  selector:
    app: mgo
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: ClusterIP

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mygolb
  namespace: myweb
spec:
  rules:
    - host: api2.cyylog.cn
      http:
        paths:
          - path: /
            backend:
              serviceName: mygo-service
              servicePort: 80
ETCD
单体部署etcd到k8s中

镜像地址

etcd是一个高可用的键值存储系统,场景主要是
1、主要用于共享配置
2、服务注册与发现
3、分布式锁等
etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 等。它使用Go语言编写


https://quay.io/repository/coreos/etcd?tag=latest&tab=tags

先pull镜像

Red Hat运营的镜像库
docker pull quay.io/coreos/etcd:v3.3.25

由于不可描述的原因,一般你是干不下来的。

于是可以用中科大的地址:
  docker pull  quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25

(不一定稳定,不能用则自己打包)

修改tag

1、docker tag quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25 etcd:3.3.25
2、docker rmi quay.mirrors.ustc.edu.cn/coreos/etcd:v3.3.25

接下来

在我们之前做的nfs-server中 创建文件夹
1、首先创建一文件夹 : /home/cyy/etcdconf
2、cd进入后,再创建 etcd1目录

 目录结构是
[cyy@cyylog1 etcdconf]$ pwd
/home/cyy/etcdconf
[cyy@cyylog1 etcdconf]$ tree .
.
└── etcd1
    ├── conf
    └── data

配置nfs-server
sudo vi /etc/exports
加入配置(具体看视频演示)

然后执行 sudo exportfs -a 重新加载配置

查看 
showmount -e 192.168.0.129


单机配置文件
使用cm配置即可
name: etcd1
data_dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379

启动命令 是  etcd --config-file /etcd/conf/etcd.yaml

golang测试连接etcd

客户端库
  https://github.com/etcd-io/etcd/tree/master/clientv3

go get go.etcd.io/etcd/clientv3

(如果有版本冲突,可以降低grpc的库
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0 )


测试连接
export ETCDCTL_API=3  切换为API3
etcdctl get /service/test 

使用nginx-ingress反代etcd

原理
Ingress Controller监听
     两个configmap(tcp和udp),可以设置反代的TCP暴露的端口。当修改并且发生变化后,Ingress controller会去更改Nginx的配置,增加对应的监听

格式

端口::

于是我们加入 一个配置:
key是  32379对应的值是    myweb/etcd1:2379

创建etcd集群(3个节点)

之前的配置
name: etcd1
data_dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379

单机的话比较简单


基本配置
name: etcd1
data-dir: /etcd/data
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://0.0.0.0:2379
listen-peer-urls: http://0.0.0.0:2380
initial-advertise-peer-urls: http://etcd1:2380
initial-cluster-token: 'etcd-cluster'
initial-cluster: etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380
initial-cluster-state: 'new'


基本配置说明

listen-client-urls:etcd监听url和端口 
advertise-client-urls:etcdctl或curl等客户端工具交互时用的url地址(一般和上面的一样)

listen-peer-urls: 节点通信地址,  如:Leader 选举、Message消息传输、快照等。
initial-advertise-peer-urls:同上

initial-cluster-token:集群唯一标识
initial-cluster:集群中所有的initial-advertise-peer-urls的合集。
initial-cluster-state:新建集群的标识。

创建是别忘了加上环境变量:
ETCDCTL_API  =3
启动命令 是  etcd --config-file /etcd/conf/etcd.yaml


基本情况查询
查看节点列表
etcdctl -w table member list

查看单节点信息
 etcdctl -w table  endpoint status

查看全部
 etcdctl -w table --endpoints=etcd1:2379,etcd2:2379,etcd3:2379  endpoint status
sidecar

SideCar 是在 Pod 中延伸或增强主容器的 容器。主容器和 Sidecar 共享一个 Pod,可以共享相同的网络空间和存储空间

第一步:
首先利用
   nginx:1.18-alpine  。随随便便创建一个nginx服务 

接下来就可以查看日志了 
   默认目录在 /var/log/nginx下

 注意:请不要做任何改变

接下来

我做了一个 很随便 很随意的  go程序
交叉编译到linux中 。。 然后使用alpine:3.12 挂载启动
    r:=gin.New()
    r.Use(func(context *gin.Context) {
        defer func() {
            if e:=recover();e!=nil{
                context.JSON(400,gin.H{"error":e})
            }
        }()
        context.Next()
    })
    r.GET("/", func(context *gin.Context) {
        context.JSON(200,gin.H{"message":"index"})
    })

    r.Run("0.0.0.0:8080")
emptydir

文档
https://kubernetes.io/zh/docs/concepts/storage/volumes/#emptydir

配置方式


   我们需要打开yaml的方式来进行配置 
在主容器上写入 (和image 同级)
   volumeMounts:
            - mountPath: /var/log/nginx
              name: nginx-log
SideCar中也写入
      volumeMounts:
            - mountPath: /app
              name: vol4
            - mountPath: /var/log/nginx
              name: nginx-log

最后加入

 volumes:
        - emptyDir: {}
          name: nginx-log
        - name: vol4
          persistentVolumeClaim:
            claimName: gopvc
ELK
filebeat

用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 数据库中

配置文档指引:
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html

它属于beats家族成员之一
看github地址https://github.com/elastic/beats

包含了Packetbeat收集网络流量数据、Metricbeat收集系统、进程的CPU、内存使用情况等数据、Filebeat收集文件数据 等等

安装文档:

https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-installation-configuration.html

我们后面采用docker的方式安装:
https://www.elastic.co/guide/en/beats/filebeat/current/running-on-docker.html

我们先在每个节点上执行  docker pull docker.elastic.co/beats/filebeat:7.10.0
这样可以加快点速度

基本的配置--input 
千万不要背
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html
filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/access.log

放到configmap里面


基本的配置--output 
千万不要背
https://www.elastic.co/guide/en/beats/filebeat/current/console-output.html
output.console:
  pretty: true
放到configmap里面


基本的是这样的
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
output.console:
  pretty: true
setup.template.enabled: false
scan_frequency: 2s
ElasticSearch
部署单体ElasticSearch

安装文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/docker.html

我们先在每个节点上执行 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.4.2

这样可以加快点速度

接下来的步骤

我们新开一个命名空间 叫做 elk

docker run --rm --name testes -it  docker.elastic.co/elasticsearch/elasticsearch:7.4.2 sh

进去后可以看到 ,es的配置文件主要在:
 /usr/share/elasticsearch/config

我们把他们都拷贝下来

cd  /usr/share/elasticsearch/config && cat elasticsearch.yml

mkdir myes
然后创建一个文件夹叫做 es1  (猜也能猜出 我们后面要创建集群)

就拷贝到这个地方

docker cp testes:/usr/share/elasticsearch/config .

基本的配置就能启动

cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es1"
cluster.initial_master_nodes: ["es1"]
#设置一个集群启动时适合做主节点的列表

在各个节点上执行:
sudo sysctl -w vm.max_map_count=262144

(一个进程可以拥有的VMA(虚拟内存区域)的数量)
ElasticSearch集群(2节点)
cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es1"
cluster.initial_master_nodes: ["es1"]
#设置一个集群启动时适合做主节点的列表

增加一些配置 :
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es1", "es2"]

我们再来一个

cluster.name: myes
network.host: 0.0.0.0
http.port: 9200
node.name: "es2"
cluster.initial_master_nodes: ["es1"]
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es1", "es2"]


使用的镜像依然是:docker.elastic.co/elasticsearch/elasticsearch:7.4.2
挂载文件依然是elasticsearch.yml 挂载到/usr/share/elasticsearch/config/elasticsearch.yml
部署Kibana

安装文档:
https://www.elastic.co/guide/en/kibana/current/docker.html

我们先在每个节点上执行 docker pull docker.elastic.co/kibana/kibana:7.4.2

这样可以加快点速度

或者
去hub.docker.com 下载 (es也一样)
https://hub.docker.com/r/elastic/kibana/tags


docker pull elastic/kibana:7.4.2

注意,此时镜像名称就是elastic/kibana:7.4.2

当然 你可以自己改掉

查看配置文件

 docker run --rm --name testkb -it  elastic/kibana:7.4.2 sh

我们发现 
kibana的配置 文件在 /usr/share/kibana/config这个目录, 叫做kibana.yml


接下来 我们自己创建

server.port: 5601   
server.host: "0.0.0.0"

#ES请求的服务URL
elasticsearch.hosts: ["http://es1:9200","http://es2:9200"]
#无证书
elasticsearch.ssl.verificationMode: none
xpack.security.enabled: false   //不使用安全验证

Kibana 身份验证

给Kibana加入Basic Auth身份验证

加入标签
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: kb-auth

文档在此:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#authentication


安装工具
yum -y install httpd-tools
Apache的Web服务器内置的工具,用于创建和更新储存用户名和用户基本认证的密码文件

创建一个密码文件  
htpasswd -c auth cyylog
这时产生了一个 auth文件

再添加一个  用户(此时不用-c参数)
htpasswd  auth admin
kb.cyylog.cn


创建secret
kubectl -n elk create secret generic kb-auth  --from-file=auth 
IK中文分词插件

nfsserver

sudo vi /etc/exports

加入一行
/home/cyy/es 192.168.0.0/24(rw,async,insecure,no_root_squash)

(/home/cyy/es  请自行创建,ip请自行修改)
修改后 执行
exportfs -r 或者 systemctl reload nfs-server

确认:
  showmount -e 192.168.0.129

ES 的插件路径

我们使用的 es7.4.2 ,默认容器的插件路径在:
/usr/share/elasticsearch/plugins

我们把它挂载到刚才创建的目录中


https://github.com/medcl/elasticsearch-analysis-ik

下载地址:
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.4.2

解压后(文件夹名设置成analysis-ik ,然后通通拷贝到plugins里面)
个人操作:
 先拷贝到 tmp目录下,然后 sudo 拷贝过来
  cp ~/tmp/analysis-ik .  -r


注意:分词器必须和你的ES版本一致,必须、必须、必须


测试下

POST  _analyze
{
  "analyzer": "ik_smart",
   "text" : "程序教程java"
}

创建一个索引试试

PUT news
{
  "mappings": {
    "properties": {
      "news_title": {
        "type":  "text"
      },
      "news_kind": {
        "type":  "keyword"
      }
    }
  }
}
使用SQL查询ES

创建一个索引试试

 PUT /books
{
  "mappings": {
    "properties": {
      "BookID":    { "type": "integer" },
      "BookName":    { "type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","fields":{ "keyword":{"type":"keyword","ignore_above":256}}},  
      "BookPrice":   { "type": "float"},  
      "BookAuthor":   { "type": "keyword"}
    }
  }
}

批量插入一些数据

POST _bulk
{ "index" : { "_index" : "books", "_id" : "101" } }
{"BookID":101,"BookName":"C语言程序设计","BookPrice":19,"BookAuthor":"老蒋"}
{ "index" : { "_index" : "books", "_id" : "102" } }
 {"BookID":102,"BookName":"PHP高级编程","BookPrice":29,"BookAuthor":"老李"}
{ "index" : { "_index" : "books", "_id" : "103" } }
 {"BookID":103,"BookName":"java编程从入门到精通","BookPrice":39,"BookAuthor":"老王"}
{ "index" : { "_index" : "books", "_id" : "104" } }
 {"BookID":104,"BookName":"无需流汗和吃苦3天成为java大神","BookPrice":15.5,"BookAuthor":"老张"}
SQL访问

文档
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-getting-started.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-syntax-select.html

POST /_sql
{  
   "query": "SELECT * FROM books WHERE BookAuthor = '老王'"
}

加入?format=txt 参数可以显示 table格式

翻译

POST /_sql/translate
{  
   "query": "SELECT * FROM books WHERE BookAuthor = '老王'"
}

加入?format=txt 参数可以显示 table格式
match

文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-functions-search.html


 "query": "SELECT BookName,BookID FROM books WHERE match(BookName,'我从小就喜欢编程')  "

 "query": "SELECT BookName,BookID FROM books WHERE match('BookName','我从小就喜欢java编程') order by SCORE() desc "
实操示范

配置负载均衡、Go调用

首先安装客户端库

go get github.com/olivere/elastic/v7
func getClient() *elastic.Client  {
    client, err := elastic.NewSimpleClient(
        elastic.SetSniff(false),
        elastic.SetURL("http://es.jtthink.com/es1/","http://es.jtthink.com/es2/" ),
    )
    if err != nil {
        panic(err)
    }
    return  client
}


辅助函数

type Books struct{
    BookID int
    BookName string
    BookPrice1 float64
    BookAuthor string
}
func MapToBooks(rsp *elastic.SearchResult) []*Books  {
    ret:=[]*Books{}
    var t *Books
    for _,item:=range rsp.Each(reflect.TypeOf(t)){
        ret=append(ret,item.(*Books))
    }
    return ret
}


具体代码
matchQuery:=elastic.NewMatchQuery("BookName","编程")
   ret,err:=getClient().Search().Index("books").Query(matchQuery).Do(context.Background())
   if err!=nil{
         log.Fatal(err)
   }
   books:=MapToBooks(ret)


翻译
POST /_sql/translate
{  
   "query": "SELECT * FROM books WHERE BookAuthor = '老王'"
}

加入?format=txt 参数可以显示 table格式


 match

文档:
  https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-functions-search.html

 "query": "SELECT BookName,BookID FROM books WHERE match(BookName,'我从小就喜欢编程')  "


 "query": "SELECT BookName,BookID FROM books WHERE match('BookName','我从小就喜欢java编程') order by SCORE() desc "

 上一篇
学习方法论-转载 学习方法论-转载
前言高效的学习离不开日复一日的努力,也离不开一个好的身体和饱满的精神。如果你要高效的学习,就必须远离那些花费大量时间的电子游戏,网络小说,这是必须的!不然一放松,就会不由自主的想那些东西。 每天最好是9点前睡觉,早上6点左右起。不要觉得睡不
2021-07-14
下一篇 
traefik notes traefik notes
快速上手traefik速学实战traefik是什么 Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Me
2021-04-10
  目录