0%

yum安装

yum update
yum install haproxy

修改haproxy配置文件

默认目录:/etc/haproxy/haproxy.cfg,下面是一些参考配置

#---------------------------------------------------------------------
# Global settings    
#---------------------------------------------------------------------
global    #全局配置文件
    log         127.0.0.1 local2        #日志配置,所有的日志都记录本地,通过local2输出
    maxconn         20000
    ulimit-n	16384
    #chroot      /var/lib/haproxy        #改变haproxy的工作目录
    #pidfile     /var/run/haproxy.pid    #指定pid文件的路径
    maxconn     4000                    #最大连接数的设定
    #user        haproxy                 #指定运行服务的用户
    #group       haproxy                 #指定运行服务的用户组
    daemon
 
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
     
    mode                    http                  #默认使用协议,可以为{http|tcp|health} http:是七层协议 tcp:是四层 health:只返回OK
    log                     global                #全局日志记录
    option                  httplog               #详细记录http日志
    option                  dontlognull           #不记录空日志
    option http-server-close                      #启用http-server-close
    option forwardfor       except 127.0.0.0/8    #来自这些信息的都不forwardfor
    option                  redispatch            #重新分发,ServerID对应的服务器宕机后,强制定向到其他运行正常的服务器
    retries                 3                      #3次连接失败则认为服务不可用
    timeout http-request    10s                    #默认http请求超时时间
    timeout queue           1m                     #默认队列超时时间
    timeout connect         10s                    #默认连接超时时间
    timeout client          1m                     #默认客户端超时时间
    timeout server          1m                     #默认服务器超时时间
    timeout http-keep-alive 10s                    #默认持久连接超时时间
    timeout check           10s                    #默认检查时间间隔
    maxconn                 3000                   #最大连接数
 
######## 监控界面配置 #################
listen admin_status
        # 监控界面访问信息
        bind 0.0.0.0:8888
        mode http
        #自动刷新时间
        stats refresh 30s
        # URI相对地址
        stats uri /
        # 统计报告格式
        # stats realm Global\ statistics
        stats realm welcome login\ Haproxy
        # 登录账户信息
        stats auth admin:123456
        #用来隐藏统计页面上HAProxy 的版本信息
        stats hide-version
        #通过设置此选项,可以在监控页面上手工启用或禁用后端真实服务器
        stats admin if TRUE
        ########frontend配置##############
 
######## mysql负载均衡配置 ###############
listen mysql
        bind 0.0.0.0:3306
        mode tcp
        # 负载均衡算法
        # static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
        balance roundrobin
        # 日志格式
        # option tcplog
        # 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
        # create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
        # option mysql-check user haproxy
         # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
        server mysql_1 192.168.41.129:3306 check weight 1 maxconn 2000
        server mysql_2 192.168.41.130:3306 check weight 1 maxconn 2000
        server mysql_3 192.168.41.131:3306 check weight 1 maxconn 2000
        # 使用keepalive检测死链
        # option tcpka
#########################################
 
 
########test1配置#################
# listen test1
#         bind 0.0.0.0:8008
#         mode tcp
#         balance roundrobin
#         server s1 127.0.0.1:8010 weight 1 maxconn 10000 check inter 10s
#         server s2 127.0.0.1:8011 weight 1 maxconn 10000 check inter 10s
#         server s3 127.0.0.1:8012 weight 1 maxconn 10000 check inter 10s
 
########test2配置#################
# listen test2
#         bind 0.0.0.0:8007
#         mode tcp
#         balance roundrobin
#         server s1 192.168.1.88:8010 weight 1 maxconn 10000 check inter 10s

修改ulimit配置

haproxy要求ulimit大于(maxconn*2 + 15 )

#临时修改
ulimit -n 65536
 
#永久修改,需要修改/etc/security/limits.conf配置文件,文末增加以下内容,然后重新登录就可以生效
* soft nofile 65536
* hard nofile 65536
* soft nproc 65565
* hard nproc 65565

启动服务并配置自启动

启动后访问8888端口,使用admin/123456登录就可以看到UI界面了。

systemctl start haproxy
systemctl enable haproxy

创建一个注解AuthToken

所有使用这个注解的方法,均要通过权限验证才能访问。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthToken {
    /**
     * 是否只能管理员权限才能访问,默认所有用户都可以访问
     */
    boolean admin() default false;
}

创建一个拦截器AuthInterceptor

所有请求都通过拦截器

public class AuthInterceptor extends HandlerInterceptorAdapter {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        AuthToken authToken = method.getAnnotation(AuthToken.class);
        //需要验证的Method
        if (authToken != null) {
            boolean isAdmin = authToken.admin();
            //todo
            return true;
        }
        //无需验证
        return true;
    }
 
}

注册拦截器

@Configuration
public class AuthConfigurer implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(AuthInterceptor()).addPathPatterns("/**");
    }
 
    @Bean
    public AuthInterceptor AuthInterceptor() {
        return new AuthInterceptor();
    }
}

controller方法上添加注解

#需要管理员权限才能访问的
@AuthToken(admin = true)
 
#普通用户和管理员都能访问的
@AuthToken
 
#不加注解是所有人都可以访问的,不安全

环境准备

  1. 安装docker-ce(过程省略)
  2. 安装docker-compose(过程省略)
  3. 安装harbor

下载Harbor离线安装包

  1. 下载地址:http://harbor.orientsoft.cn/,找个最新的,本文使用v1.5.0版本
  2. 使用 tar xvf harbor-offline-installer-v1.5.0.tgz
  3. 进入到解压后的目录,harbor/

配置harbor.cfg【关键配置】

#hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = harbor.deri.com
 
# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
 
#配置admin用户的密码,默认Harbor12345
harbor_admin_password = Harbor12345
 
#是否只允许admin用户创建项目,everyone是所有人都可以
project_creation_restriction = adminonly
 
# 是否开启自注册
self_registration = on
 
# Token有效时间,默认30分钟
token_expiration = 30

配置docker-compose.yml

如果需要修改访问端口,默认80443,也可以不修改.

##此处粘贴部分配置  
  proxy:
    image: vmware/nginx-photon:v1.5.0
    container_name: nginx
    restart: always
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    ports:
      - 80:80
      - 443:443
      - 4443:4443
    depends_on:
      - mysql
      - registry
      - ui
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"

启动harbor

harbor/目录下,执行./install.shharbor会根据当前目录下docker-compose.yml配置,下载相关镜像,并启动。

配置本地hosts文件

配置hosts文件,增加部署机器的 IP 和 域名【域名是harbor.cfg中的hostname

Windows: C:\Windows\System32\drivers\etc\hosts 
Linux: /etc/hosts

访问Harbor

浏览器输入hostname,用户名密码:admin/Harbor12345

Harbor首页

上传镜像

创建项目

注意选择访问级别
Harbor创建项目

使用docker login登录到私有仓库

[root@node4 ~]# docker login harbor.deri.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
Login Succeeded

这里有个问题

执行上面的一步肯定会报错:Error response from daemon: Get https://harbor.deri.com/v2/users/: dial tcp 192.168.41.139:443: getsockopt: connection refused,原因是docker认为这个仓库不可信,需要在/etc/docker/daemon.json不存在就新建)增加insecure-registries配置,注意是标准的json格式!

{
  "insecure-registries": ["harbor.deri.com"]
}

然后重启docker服务

sudo systemctl daemon-reload
sudo systemctl restart docker

重启harbor服务

#到harbor/目录下执行
docker-compose down -v
docker-compose up -d

本地随便找个镜像

修改其tag,如

docker tag hub.c.163.com/library/mysql:5.7 harbor.deri.com/deri/mysql:5.7

注意tag格式:域名/项目名/镜像名:版本

上传镜像

docker push harbor.deri.com/deri/mysql:5.7

登录UI查看

harbor镜像仓库

从私有镜像仓库拉取镜像

docker pull harbor.deri.com/deri/mysql:5.7

退出登录

docker logout harbor.deri.com

使用结束!接下来创建项目、用户了。

有时候我们需要将k8s集群外的服务引入到集群内部来,便于集群内部服务调用,我可以使用Endpoints.

引入外部myql

编写k8s-mysql-endpoints.yaml

为外部Mysql创建Endpoints

apiVersion: v1
kind: Endpoints
metadata:
  name: mysql
  namespace: default
subsets:
  - addresses:
      - ip: 192.168.1.11
    ports:
      - port: 20030
  1. 可以使用命令kubectl get endpoints查看是否创建完成
  2. kubectl describe endpoints mysql 查看具体描述

编写k8s-mysql-service.yaml

编写k8s-mysql-service.yaml,为endpoints发布成内部pod可以调用的服务

注意metadata.namek8s-mysql-endpoints.yamlmetadata.name保持一致,此处均为mysql.

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 20030
  1. 可以使用命令 kubectl get svc 查看是否服务创建完成
  2. kubectl describe svc mysql 查看具体服务描述

测试endpoints是否生效

为了方便测试endpoints是否生效,我们修改上述的k8s-mysql-service.yaml配置

  1. 我们将type类型改为NodePort,这样可以设定宿主机上的映射端口号nodePort:30030,这样直接通过宿主机IP:30030就可以调用到mysql服务。
  2. 注意删除了创建好的service,对应的endpoints也会删除掉,需要重新创建!测试的时候注意!
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: NodePort
  ports:
  - port: 20030
    targetPort: 20030
    protocol: TCP
    nodePort: 30030

使用Navicat测试

使用Navicat测试,输入宿主机IP和端口30030(用户名密码还是外部数据库原本的用户名密码),测试连接!成功!证明了通过Endpoints机制可以将外部服务发布成k8s内部的服务!

发布外部的redis服务也是同理,只需要修改nameportip等参数即可!

consul具体配置、ACL配置可以参考Consul系列文章

首先创建k8s-consul-config.json文件

注意token需要自己创建一个,这里加密处理了

{
    "datacenter":"dc8",
    "primary_datacenter":"dc8",
    "acl":{
        "enabled":true,
        "default_policy":"deny",
        "enable_token_persistence":true,
        "enable_key_list_policy":true,
        "tokens":{
            "master":"14d54c5e-24ca-****-*******-*********"
        }
    }
}

创建configmap

kubectl  create configmap consul --from-file=k8s-consul-config.json

上述命令创建一个名称为consul,内容为一个文件,文件名为k8s-consul-config.jsonconfigmap可以挂载在volume下.

修改 k8s-consul-statefulset.yaml文件

注意内容:

  1. 在配置最后挂载了volumes-configmap,就是我们刚刚创建的consul
  2. - “-config-file=/etc/consul/config/k8s-consul-config.json” 配置了我们保存的consul ACL相关配置
  3. requiredDuringSchedulingIgnoredDuringExecution,我们增加了这个配置,保证了consul的pod不会在同一台机器上运行【反亲和特性】,因为我们将consul/data挂载的是hostPath,如果一台机器启动多个会有冲突导致consul启动卡住。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: consul
spec:
  serviceName: consul
  replicas: 3
  template:
    metadata:
      labels:
        app: consul
        component: server
    spec:
      serviceAccountName: consul
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - consul
              topologyKey: kubernetes.io/hostname
      terminationGracePeriodSeconds: 10
      containers:
      - name: consul
        image: consul:1.6.0
        args:
          - "agent"
          - "-server"
          - "-bootstrap-expect=3"
          - "-ui"
          - "-data-dir=/consul/data"
          - "-config-file=/etc/consul/config/k8s-consul-config.json"
          - "-bind=0.0.0.0"
          - "-client=0.0.0.0"
          - "-advertise=$(PODIP)"
          - "-retry-join=consul-0.consul.$(NAMESPACE).svc.cluster.local"
          - "-retry-join=consul-1.consul.$(NAMESPACE).svc.cluster.local"
          - "-retry-join=consul-2.consul.$(NAMESPACE).svc.cluster.local"
          - "-domain=cluster.local"
          - "-disable-host-node-id"
        volumeMounts:
          - name: data
            mountPath: /consul/data
          - name: config
            mountPath: /etc/consul/config
        env:
          - name: PODIP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        ports:
          - containerPort: 8500
            name: ui-port
          - containerPort: 8400
            name: alt-port
          - containerPort: 53
            name: udp-port
          - containerPort: 8443
            name: https-port
          - containerPort: 8080
            name: http-port
          - containerPort: 8301
            name: serflan
          - containerPort: 8302
            name: serfwan
          - containerPort: 8600
            name: consuldns
          - containerPort: 8300
            name: server
      volumes:
        - name: data
          hostPath:
            path: /root/consul/data
        - name: config
          configMap:
            name: consul

最后根据上面的配置重新创建consul的StatefulSet,启动完成后根据之前consul的知识,我们需要使用master token登录到ui,创建Agent token,然后修改configmap中acl配置,增加agent token,具体可以参考之前的文章。然后删除consul的pod,让k8s重新创建新的pod,使我们新的configmap生效即可。

用途 命令
查看集群状态 kubectl cluster-info
查看集群详细状态 kubectl cluster-info dump
查看节点 kubectl get nodes
查看节点更多信息 kubectl get nodes -o wide
标志一个节点不可调度 kubectl cordon -nodeName
标志一个节点可调度 kubectl uncordon -nodeName
查看token列表 kubeadm token list
创建token kubeadm token create
删除节点 kubectl drain <node name> --delete-local-data --force --ignore-daemonsets/kubectl delete node <node name>
创建一个deployment kubectl create deployment nginx --image=nginx
查看deployments kubectl get deployment(deployments)
创建一个service kubectl create service nodeport nginx --tcp 80:80
查看services kubectl get svc(service/services)
删除一个deployment kubectl delete deployments/nginx
删除一个service kubectl delete services/nginx
同时删除deployment和service kubectl delete deployments/nginx services/nginx
从yaml文件创建deployment kubectl create -f deployment.yaml
查看pods kubectl get pods(pod)
查看pod更多信息 kubectl get pods -o wide
查看具体pod信息 kubectl describe pods/kube-node-59bf664cbf-2qzgd
修改deployment kubectl edit deployments/test
从yaml创建service kubectl create -f service.yaml
快捷创建service(expose) kubectl expose deployment kube-node --type=NodePort
查看service具体信息 kubectl describe services/kube-node
查看namespace kubectl get namespace
创建namespace kubectl create namespace -name
删除namespace kubectl delete namespace -name
根据配置文件创建configmap kubectl create configmap my-config --from-file=path/to/bar/kubectl create configmap my-config --from-file=key1=/path/file1.txt --from-file=key2=/path/to/bar/file2.txt
从字符串创建configmap kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
从env文件创建configmap kubectl create configmap my-config --from-env-file=path/to/bar.env
扩容 kubectl scale deployment nginx-deployment --replicas 10
自动扩容 kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
更新镜像 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
回滚 kubectl rollout undo deployment/nginx-deployment
查看默认配置项,如pod.spec kubectl explain pod.spec

以上都是亲自用过的,没用过的自己查表,附上kubectl命令表

kubectl命令自动补全

CentOS Linux系统上,您可能需要安装默认情况下未安装的bash-completion软件包。

yum install bash-completion -y

执行source <(kubectl completion bash)命令在您目前正在运行的shell中开启kubectl自动补全功能。

可以将上述命令添加到shell配置文件中,这样在今后运行的shell中将自动开启kubectl自动补全:

echo "source <(kubectl completion bash)" >> ~/.bashrc

快速生成YAML样例

# 用run命令生成
kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml
# 用get命令导出
kubectl get statefulset/foo -o=yaml --export > new.yaml
# Pod亲和性下面字段的拼写忘记了
kubectl explain pod.spec.affinity.podAffinity