EExcel 丞燕快速查詢2

EExcel 丞燕快速查詢2
EExcel 丞燕快速查詢2 https://sandk.ffbizs.com/

k8s nfs v4 kubernetes

https://hub.docker.com/r/itsthenetwork/nfs-server-alpine

https://sueboy.blogspot.com/2019/11/kubernetes-nodeport.html

ConfigMap


apiVersion: v1
kind: ConfigMap
metadata:
  name: nfs
  namespace: nfs
data:
  exports: |
    {{SHARED_DIRECTORY}} {{PERMITTED}}({{READ_ONLY}},fsid=0,{{SYNC}},no_subtree_check,no_auth_nlm,insecure,no_root_squash)
  nfsd: |
    #!/bin/bash

    # Make sure we react to these signals by running stop() when we see them - for clean shutdown
    # And then exiting
    trap "stop; exit 0;" SIGTERM SIGINT

    stop()
    {
      # We're here because we've seen SIGTERM, likely via a Docker stop command or similar
      # Let's shutdown cleanly
      echo "SIGTERM caught, terminating NFS process(es)..."
      /usr/sbin/exportfs -uav
      /usr/sbin/rpc.nfsd 0
      pid1=`pidof rpc.nfsd`
      pid2=`pidof rpc.mountd`
      # For IPv6 bug:
      pid3=`pidof rpcbind`
      kill -TERM $pid1 $pid2 $pid3 > /dev/null 2>&1
      echo "Terminated."
      exit
    }
    
    # Check if the SHARED_DIRECTORY variable is empty
    if [ -z "${SHARED_DIRECTORY}" ]; then
      echo "The SHARED_DIRECTORY environment variable is unset or null, exiting..."
      exit 1
    else
      echo "Writing SHARED_DIRECTORY to /etc/exports file"
      /bin/sed -i "s@{{SHARED_DIRECTORY}}@${SHARED_DIRECTORY}@g" /etc/exports
    fi

    # This is here to demonsrate how multiple directories can be shared. You
    # would need a block like this for each extra share.
    # Any additional shares MUST be subdirectories of the root directory specified
    # by SHARED_DIRECTORY.

    # Check if the SHARED_DIRECTORY_2 variable is empty
    if [ ! -z "${SHARED_DIRECTORY_2}" ]; then
      echo "Writing SHARED_DIRECTORY_2 to /etc/exports file"
      echo "{{SHARED_DIRECTORY_2}} {{PERMITTED}}({{READ_ONLY}},{{SYNC}},no_subtree_check,no_auth_nlm,insecure,no_root_squash)" >> /etc/exports
      /bin/sed -i "s@{{SHARED_DIRECTORY_2}}@${SHARED_DIRECTORY_2}@g" /etc/exports
    fi

    # Check if the PERMITTED variable is empty
    if [ -z "${PERMITTED}" ]; then
      echo "The PERMITTED environment variable is unset or null, defaulting to '*'."
      echo "This means any client can mount."
      /bin/sed -i "s/{{PERMITTED}}/*/g" /etc/exports
    else
      echo "The PERMITTED environment variable is set."
      echo "The permitted clients are: ${PERMITTED}."
      /bin/sed -i "s/{{PERMITTED}}/"${PERMITTED}"/g" /etc/exports
    fi

    # Check if the READ_ONLY variable is set (rather than a null string) using parameter expansion
    if [ -z ${READ_ONLY+y} ]; then
      echo "The READ_ONLY environment variable is unset or null, defaulting to 'rw'."
      echo "Clients have read/write access."
      /bin/sed -i "s/{{READ_ONLY}}/rw/g" /etc/exports
    else
      echo "The READ_ONLY environment variable is set."
      echo "Clients will have read-only access."
      /bin/sed -i "s/{{READ_ONLY}}/ro/g" /etc/exports
    fi

    # Check if the SYNC variable is set (rather than a null string) using parameter expansion
    if [ -z "${SYNC+y}" ]; then
      echo "The SYNC environment variable is unset or null, defaulting to 'async' mode".
      echo "Writes will not be immediately written to disk."
      /bin/sed -i "s/{{SYNC}}/async/g" /etc/exports
    else
      echo "The SYNC environment variable is set, using 'sync' mode".
      echo "Writes will be immediately written to disk."
      /bin/sed -i "s/{{SYNC}}/sync/g" /etc/exports
    fi

    # Partially set 'unofficial Bash Strict Mode' as described here: http://redsymbol.net/articles/unofficial-bash-strict-mode/
    # We don't set -e because the pidof command returns an exit code of 1 when the specified process is not found
    # We expect this at times and don't want the script to be terminated when it occurs
    set -uo pipefail
    IFS=$'\n\t'

    # This loop runs till until we've started up successfully
    while true; do

      # Check if NFS is running by recording it's PID (if it's not running $pid will be null):
      pid=`pidof rpc.mountd`

      # If $pid is null, do this to start or restart NFS:
      while [ -z "$pid" ]; do
        echo "Displaying /etc/exports contents:"
        cat /etc/exports
        echo ""

        # Normally only required if v3 will be used
        # But currently enabled to overcome an NFS bug around opening an IPv6 socket
        echo "Starting rpcbind..."
        /sbin/rpcbind -w
        echo "Displaying rpcbind status..."
        /sbin/rpcinfo

        # Only required if v3 will be used
        # /usr/sbin/rpc.idmapd
        # /usr/sbin/rpc.gssd -v
        # /usr/sbin/rpc.statd

        echo "Starting NFS in the background..."
        /usr/sbin/rpc.nfsd --debug 8 --no-udp --no-nfs-version 2 --no-nfs-version 3
        echo "Exporting File System..."
        if /usr/sbin/exportfs -rv; then
          /usr/sbin/exportfs
        else
          echo "Export validation failed, exiting..."
          exit 1
        fi
        echo "Starting Mountd in the background..."These
        /usr/sbin/rpc.mountd --debug all --no-udp --no-nfs-version 2 --no-nfs-version 3
    # --exports-file /etc/exports

        # Check if NFS is now running by recording it's PID (if it's not running $pid will be null):
        pid=`pidof rpc.mountd`

        # If $pid is null, startup failed; log the fact and sleep for 2s
        # We'll then automatically loop through and try again
        if [ -z "$pid" ]; then
          echo "Startup of NFS failed, sleeping for 2s, then retrying..."
          sleep 2
        fi

      done

      # Break this outer loop once we've started up successfully
      # Otherwise, we'll silently restart and Docker won't know
      echo "Startup successful."
      break

    done

    while true; do

      # Check if NFS is STILL running by recording it's PID (if it's not running $pid will be null):
      pid=`pidof rpc.mountd`
      # If it is not, lets kill our PID1 process (this script) by breaking out of this while loop:
      # This ensures Docker observes the failure and handles it as necessary
      if [ -z "$pid" ]; then
        echo "NFS has failed, exiting, so Docker can restart the container..."
        break
      fi

      # If it is, give the CPU a rest
      sleep 1

    done

    sleep 1
    exit 1
  bashrc: |
    # General Aliases
    alias apk='apk --progress'
    alias ll="ls -ltan"

    alias hosts='cat /etc/hosts'
    alias ..="cd .."
    alias ...="cd ../.."
    alias ....="cd ../../.."
    alias untar="tar xzvkf"
    alias mv="mv -nv"
    alias cp="cp -i"
    alias ip4="ip -4 addr"
    alias ip6="ip -6 addr"

    COL_YEL="\[\e[1;33m\]"
    COL_GRA="\[\e[0;37m\]"
    COL_WHI="\[\e[1;37m\]"
    COL_GRE="\[\e[1;32m\]"
    COL_RED="\[\e[1;31m\]"

    # Bash Prompt
    if test "$UID" -eq 0 ; then
        _COL_USER=$COL_RED
        _p=" #"
    else
        _COL_USER=$COL_GRE
        _p=">"
    fi
    COLORIZED_PROMPT="${_COL_USER}\u${COL_WHI}@${COL_YEL}\h${COL_WHI}:\w${_p} \[\e[m\]"
    case $TERM in
        *term | rxvt | screen )
            PS1="${COLORIZED_PROMPT}\[\e]0;\u@\h:\w\007\]" ;;
        linux )
            PS1="${COLORIZED_PROMPT}" ;;
        * ) 
            PS1="\u@\h:\w${_p} " ;;
    esac


Deployment

Different is ln /exports/exports /etc/exports
ConfigMAP /etc have read-only problem


apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-service
  namespace: nfs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-service
  template:
    metadata:
      labels:
        app: nfs-service
    spec:
      #restartPolicy: Always
      volumes:
        - name: exports
          configMap:
            name: nfs
            items:
              - key: exports
                path: exports
                mode: 0744
        - name: nfsd
          configMap:
            name: nfs
            items:
              - key: nfsd
                path: nfsd.sh
                mode: 0744
        - name: bashrc
          configMap:
            name: nfs
            items:
              - key: bashrc
                path: .bashrc
                mode: 0744
        - name: nfsshare
          emptyDir: {}  
      containers:
        - name: nfs-server-container
          image: alpine:latest
          securityContext:
            privileged: true
          command:
            - /bin/sh
            - -c
            - |
              echo nameserver 8.8.8.8 >> /etc/resolv.conf
              apk add --no-cache --update --verbose nfs-utils bash iproute2 
              rm -rf /var/cache/apk /tmp /sbin/halt /sbin/poweroff /sbin/reboot 
              mkdir -p /var/lib/nfs/rpc_pipefs /var/lib/nfs/v4recovery 
              echo "rpc_pipefs    /var/lib/nfs/rpc_pipefs rpc_pipefs      defaults        0       0" >> /etc/fstab 
              echo "nfsd  /proc/fs/nfsd   nfsd    defaults        0       0" >> /etc/fstab 
              rm /etc/exports 
              cp /exports/exports /etc/exports 
              cp /nfsd/nfsd.sh /usr/bin/nfsd.sh
              cp /bashrc/.bashrc /root/.bashrc
              chmod +x /usr/bin/nfsd.sh
              /usr/bin/nfsd.sh
          env:
            - name: SHARED_DIRECTORY
              value: "/nfsshare"
          volumeMounts:
            - name: exports
              mountPath: /exports
              #readOnly: true
            - name: nfsd
              mountPath: /nfsd
            - name: bashrc
              mountPath: /bashrc 
            - name: nfsshare
              mountPath: /nfsshare 

k8s ConfigMap mountPath need becarful. like this example exports and nfsd are /etc & /usr/bin. This two directory already have file inside. When you director mountPath: /etc or mountPath: /usr/bin . k8s replace this two path to other direcotry. ls -al /etc or /usr/bin that only get exports file and nfsd.sh file. So better way is mountPath usually different directory. In shell: Use Copy that copy exprots file and nfsd.sh file to docker image correct directory.


Service


kind: Service
apiVersion: v1
metadata:
  name: nfs-service
  namespace: nfs
spec:
  selector:
    app: nfs-service
  type: NodePort
  ports:
    # Open the ports required by the NFS server
    # Port 2049 for TCP
    - name: tcp-2049
      port: 2049
      targetPort: 2049
      protocol: TCP
      nodePort: 32049

    # Port 111 for UDP
    - name: udp-111
      port: 111
      protocol: UDP



======nfs v4 client mount
debain
https://blog.gtwang.org/linux/nfsv4/

Centos
https://computingforgeeks.com/configure-nfsv3-and-nfsv4-on-centos-7/


$ sudo yum -y install nfs-utils
$ sudo systemctl start rpcbind 
$ sudo systemctl enable rpcbind

mount -v -o port=32049 -o vers=4 -t nfs 192.168.99.118:/ /tmp/tnfs/
nano /tmp/tnfs/tt  # save some text. Then check nfs pod /nfsshare have tt and tt context



skype 8 自動登入..... 令人無言的設計

skype 8登入後自動記住登入帳密,下次登入時,不會詢問,一般會有不記憶選項,但沒有! 唯一只能登出時選擇


等到下次再登入就會詢問,但實際上再次登入後,登出、登入…又不用輸入……


難怪軟微推什麼產品,失敗居多!

kubernetes Deployment Failed to fetch Temporary failure resolving

IF you apt-get update in k8s Deployment yaml that containers command run it. Maybe get

Deployment Failed to fetch Temporary failure resolving


So just put this line before script


- /bin/bash
- -c
- |
  echo nameserver 8.8.8.8 >> /etc/resolv.conf
  apt-get update


Usually you get this problem because try to transfer Dockerfile / docker-compose directory to ConfigMap and Deployment YAML. Dockerfile have apt-get update that get problem.

[轉]你到底知不知道什麼是 Kubernetes?

https://www.hwchiu.com/kubernetes-concept.html


然而通常 A/B/C/D 都不是底下的工程人員,所以最後都會變成用嘴巴生架構,用嘴巴解決問題,底下實際的工程人員則是各種崩潰

goodbye microservices

https://segment.com/blog/goodbye-microservices/

核心服務 不見得要微服務化,因為共同開發上,減少一些問題

In early 2017 we reached a tipping point with a core piece of Segment’s product. It seemed as if we were falling from the microservices tree, hitting every branch on the way down. Instead of enabling us to move faster, the small team found themselves mired in exploding complexity. Essential benefits of this architecture became burdens. As our velocity plummeted, our defect rate exploded.

Eventually, the team found themselves unable to make headway, with 3 full-time engineers spending most of their time just keeping the system alive. Something had to change. This post is the story of how we took a step back and embraced an approach that aligned well with our product requirements and needs of the team.


===
Ditching Microservices and Queues

The first item on the list was to consolidate the now over 140 services into a single service. The overhead from managing all of these services was a huge tax on our team. We were literally losing sleep over it since it was common for the on-call engineer to get paged to deal with load spikes.


===

While we did have auto-scaling implemented, each service had a distinct blend of required CPU and memory resources, which made tuning the auto-scaling configuration more art than science.

===

===
跟當初想法一樣,微服務化會成幾何成長的複雜度,人力夠ok,人力不夠,搞這個找死

k8s kubernetes Lesson 6 yaml docker-registry cron part 2 No minikube

normal k8s

https://sueboy.blogspot.com/2019/11/kubernetes-nodeport.html

namespace docker-registry

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "docker-registry",
    "labels": {
      "name": "test-dev"
    }
  }
}



secret.yml ID/PWD:username/password tls:cn=docker-registry

apiVersion: v1
kind: Secret
metadata:
  name: registry-tls
  namespace: docker-registry
type: Opaque
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVzRENDQXBnQ0NRRHpteitOQUZCMGRUQU5CZ2txaGtpRzl3MEJBUXNGQURBYU1SZ3dGZ1lEVlFRRERBOWsKYjJOclpYSXRjbVZuYVhOMGNua3dIaGNOTVRrd01qSTJNVEF3TlRBMldoY05NakF3TWpJMk1UQXdOVEEyV2pBYQpNUmd3RmdZRFZRUUREQTlrYjJOclpYSXRjbVZuYVhOMGNua3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRRFBKcHhZK0RVQ05aMVh4Tkc0bUJlaFp2ZXZ4R21XMFdZandhRklzcFQ0L09ETWgwZVgKRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMFdhdG5uVDc5bm5wZUVHdFNtQUJHeXMyU1hxdDZ3SzJubHJSLwowVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnNHlHSWxuZ2ZXUFBCTzkvVFhnS2Jmc2xBTk9uTXY0ckVTMlNFCkZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNiRllublZJS2l2eTdqY0l0Q2JoelZsTHRuOHFIRE5YcElHSlpTTlYKUkdSdUVhN3ZFbUloei90blJZdFJRTmpSNGhQNkM5eG1QMFpBZFhjQWZYMTk0aVVKNDRFYnZUZ0NKK0I4Yi9jdwpEZ29IRWxCbGtJaUtmSm9wL0RhR3B5OUY0VjRhbHZIcnNMdFdYYTZYWmQzeGxmWWx6S2xMZ0IzTDJVQ2VCUWljCk0yUDlXMEZZZGFIR3NjUkFyNGQvbEtiZE1PYXNDV2dXaHlGekRDMUFYQkcxdU9SSXFBbi84OTJPQnk1UVE2SDQKSk9yOXNRRGhRejVEdWZReFlGNDZUZjZUNk9MOGp6TkUrUk11YmR2RmVVS1ZwYzJXazgrVWY3UE9OdW9iRC9XZgpTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzTU8xOFJ3UTIzU2ZFT1dMZFFseU8rYXg3STZKVm5CbG1xaStFCk16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1A3RFdYR3JrZ2l6SloweUUveE55dkJuLy9GeWtIYTlIdjBhUk0KNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdqWHNEb3R2R1U5VjU4ems2S21oVGRjN3V0cE9Hb0Nud0lEQVFBQgpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUM4U1orN0V3U0liY0tDT0xoV3NvbDEzNUVIYVdiRTEzOFRRdHBVCk55aExqZXM3THVQSjg3YVdjK0NWT3VMWEdIY2FtTiszQWhKL1k3L1U5NlVCWS8yTDREUnd6b0RDYzhhQ3ZQY0oKZDhWcGxvUXJuRzRueUgxVTJUV243SXo1UDNrYjVZeE82UHlVdlNZMTJTaXBxWmVuQU1STzVQSDRlUldwbDkwbAp3cHJDVU1TNGhaL3FGVE1ORG1HSzBGS243VHZRekZrSVo1eEhUK0VncTNzcERVY1BCenV4WVdGTG9pT2ZGUFRZCnZkSDc5Vis5K1p6T3ZBVlF3ZHhHSVlOaGlpNGd1OTg4N3Jld3RKbEZUQ1pXT05DWnNMcUw0RHBtWmJhbUlxRi8KakF5ZUR4T2kwN2VKcTlUREFLUlErZzg1NzMvR2JhVU5MVHVndzM0Z1pNZUttUnNzUjBEZWc5ckFHeXRRM2pqRApqeWJLYmo1SE8vT25xNTlGSk9rRi94eklZYWtXcjVPem1kRzJDdVhNOXhSN3BYSm5IM0RKcWUwc2FQd2ZMV2xPClF3L1RRM1lpMHg4ajhwOTRpeHZWbnRPRFRIUXBmeUFDMDloaFNmVG1sMnJXT3FqTzJ4d1dzUkhEOXBUQ0FpMG0KTHlZQS9UTVVXRWdMdklmMEZjOXRZZGkrck9HQVJuRWdXdjdhRjhKL0pRUlZ2ZjBVL2hGTmo4bFRmY0RuOU95WQprVEtWdHNRVllqZXNBU1lIdzYyRmZoUkRIZmZRbUlscTN3emljU3MvbnBQMzZraExCZGt0TnZzakVNaE40a0JLCjR5NlJWekdZR20rakpVQk8zV3ZQbHF0T0pwVUFCbHVCWFZOK3hhMnZOODNGYjZtMFlJTmVWbXNFQmxnVTVGT1oKa2xFVTJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==
  tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFBKcHhZK0RVQ05aMVgKeE5HNG1CZWhadmV2eEdtVzBXWWp3YUZJc3BUNC9PRE1oMGVYRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMApXYXRublQ3OW5ucGVFR3RTbUFCR3lzMlNYcXQ2d0sybmxyUi8wVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnCjR5R0lsbmdmV1BQQk85L1RYZ0tiZnNsQU5Pbk12NHJFUzJTRUZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNiRlkKbm5WSUtpdnk3amNJdENiaHpWbEx0bjhxSEROWHBJR0paU05WUkdSdUVhN3ZFbUloei90blJZdFJRTmpSNGhQNgpDOXhtUDBaQWRYY0FmWDE5NGlVSjQ0RWJ2VGdDSitCOGIvY3dEZ29IRWxCbGtJaUtmSm9wL0RhR3B5OUY0VjRhCmx2SHJzTHRXWGE2WFpkM3hsZllsektsTGdCM0wyVUNlQlFpY00yUDlXMEZZZGFIR3NjUkFyNGQvbEtiZE1PYXMKQ1dnV2h5RnpEQzFBWEJHMXVPUklxQW4vODkyT0J5NVFRNkg0Sk9yOXNRRGhRejVEdWZReFlGNDZUZjZUNk9MOApqek5FK1JNdWJkdkZlVUtWcGMyV2s4K1VmN1BPTnVvYkQvV2ZTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzCk1PMThSd1EyM1NmRU9XTGRRbHlPK2F4N0k2SlZuQmxtcWkrRU16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1AKN0RXWEdya2dpekpaMHlFL3hOeXZCbi8vRnlrSGE5SHYwYVJNNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdqWApzRG90dkdVOVY1OHprNkttaFRkYzd1dHBPR29DbndJREFRQUJBb0lDQVFDb0FkZXliUFNKS3pUR3Q1R2tsbTRyCjhKZ1lUVU9hRjVFd2xOMmJXWU5yZ2FWTkhMYmFkMlRpQ3h2QVJISnVhaWpta3IzV2dCNFZRMkRoWGd5Zmg3Qk0KQUZtY3F0SndkV2xjQVNYRGZkYTBRMHRVYmUxTThWcFVRSDczYVg0K0QrNDFWdG0vN0hMTmdmN3dzV1pFSWsyZwpsd056aUgwYkw5Y0xpRVB2T0RzYlhZcE5kQnc4NTRJR0NRcGJBbDl1bnV0bFJ0T09WR216OTJ1SHhWUzN4OFJIClRoOENoeUkxNXRkeWlid1BTam4xN2kxRll1cktRQ0w0Qm8yTHhxd2lZazJ6VDNzVDFuVkRuSW01Tmg5MktnRnYKVEJYTkp2bzl1OGx3Z0x6NDQzbG1mak1hbWJDd24rSlFJL0Zpdmx1UGZrbUduZEVYV3NjRGRTcGVoR2dIVVJwTwpGWURKU29jaTlGVG5NRTF4a3c4TUR5V1JjSzdvSjJrRzd0RXh4aDBML1NjK1dmY2RKVFJyRW9BR3VxNzNYdWZGCk1CdVRoK3JCVU9ITVpSTVJMTXN6aGVTekp1SXBZU1BsNUF1VUY5cHVNd21vYkFpbXBzdmpQVEprRlR3bytLdmQKYUVlNW5IMFlmTlRNS3JSU1YybjBaTmp0dHB3VU9VZ2lXVE9VdnJXOGNiMlVJZjRpRVk3VjJBc3ArKzVvK25QdQpZRkdiZWd0d1U3dURyNTN2YjNPRE9ZRVUrUlZmYTlScWxXMUswYlpmeGZBcCtzdVNQTHczclBiNk4xZ0UybWhFCnNUcy9FYmQ5dW5Vdm1XZ0tzdGtBeDBuRVM4Z1VqNW9Zc1F5Um1wM1NaaUJXUmlXYnZoSzRaQ3k0V3NaZUZWZEoKMEtuNDZCeXB1Sndtelozd2hRMDBZUUtDQVFFQS9XODlsa0c1eW9UVXlEZnI3M0hqMHNyZ0o3amlLdlNoZ29PVwpCck1ndkxxeEMzUVRaZjg2VHpObnhoVDFwSS9sUnNRN2tiYjJhclpHZ3phRHlNemV2QXpYMUJiNnRkakxnVVIvCi9ZMTR1QW9VVzhYNEhrY0Rhb2xtVkFjOXdsRmpJcHVjY25YdEZJZ3NacnVydEJSQW9mSU91aUV4bzJCQkc3aUEKMW1qN2RqZlZwSTQzWWd4UHBiZndmVjV0bC9CTENMQis0RzZkclhvaExBdTlqSWlKNWw4MEEydG1qR3Z3S3lVTApHc3RGamc1MVcxTjQyTC8rY0FSQ213a3pUUTkwMFZaS1BaOUdtZTE2NndZdjl4eXdsZjN6L09udGJsZjRLaXE4ClVVQXR3RFF3bWFwN3o1OUhpckp1TEczMDk3QWRlNTZjQ1JOMk53c0YzYTJQM09VeFVRS0NBUUVBMFQ5dHlzK24KVHdkd0JNK0lRcVBQUWt0ZjhodENSUW1Wamw0WWVZc1ptR0F2TXRqN00wYVhjcnVLT0k2VjBmc0k2T0RrbWRDSQpnZWYwUk15WXR3czdMcGtXWmIyQzlFdzk0K3VpL2tEQVlxUUJXczBVaTQwbTdNeDgwN2pKdGZONVJad3d1MGxNCm1kR1ZSa3hkbWVtM0V6MmhsR2ltZUMvcnB5REtiMkY1SU9Mdjk1cUdlWHBlOGNwUDhVMDd6dTdqdmdDNVRSeDcKV0pYYVVFSEt4bjVHVHU2UUluMXQrZmw5MnRnNXprNmNjaklUeStvUG4yNWU1ZnR3ZlNaVzg1Tno2dFQzRE04bwpMZ0h4aFBNS0RzcjZySnVRSExObHI1MnY4TDlwVlZlWlpOanlmbDNxUmhqOE5zanN4OEhCczV1Z1ZFYU9MWkJTClFrU1pCYzNkYldONDd3S0NBUUFMWVhaemkrb0s5U0lWQjZYWnI5U2FQN0FIT0o4M2JKcmdJSWFaTUd3VTdaRkwKd1YrcG9lZDliUUtJKzZINFRObnY3cG42Tml3a3FLREwvYU8zWGJQVzRBREZMbTc5d1ltSitZaUIyMXVEY0RodgowcGtNeXdXVlFDeFBNN0FMVE5wVjBJVWJBcjZ0d0Z1MkZWRmxtYzg1Tm9TQXlVTFFZbDhxSG9QeW5PNUY1Y1g3ClNNT2w3SVdiSElKNUxzZGZIbFJRUkpTK0FWbWxVNm12cjZ0SVowMUNBaDUwMU5yYkRYSFFqaTVNZXJwWjRiNVYKWm84enRKTjVka2VEYk10WDk0eTRaZGFabzlCbzB5aEU2NWMxMHB6L2IxTUlsWHlyQ3RwREVuNDRhOWhpSERYZQpnTEJrcDNOd0FBbEFoNE9McCtYN0NpbFpvdjBaQmE2eXdMdUlJT2F4QW9JQkFILytaSkppWXQwY2w1RFp3V2ZCCis4MTVmYjhDblk3TlJnWkgySURBYlcrZnBqOWNLb3c2NmZqc2JxZ1p6OXNaeTJGbjcyMkcrWGs5QVZYME1KWUcKOExTWVAvTUw4VWF1UEUxbW5kVVlscFcvN0hRMmJoTE96TGljZk42bGNmMHlhVVFEUG12UmNtSEVxYUxPbzVLNgpPNW94WU56L0JwVU4rdi9JTnd2YWU5VjUrMzlocmxBd1lsTlVoWUg4MUZESUg5YmhhbmVZckhxTGIzY1lSNGtUClJMNlRmdWNhQW1PZUVUWUVmWmVNem5XcjNDQW5sRmJabElMcFF1M0t2ZlZRaE45b1ZaWW9RVk9qTExFK1dUQ2oKU0tLOHBYSm82aEo2U2x6aE9QVlRHQ2x2NnlVUkhYU3pZOU8vSTljczFlZWZrbnI2alkyaGNpL0c5ak51c2J0dgoxVkVDZ2dFQkFJVUdEbEcxQmpPdTVhcVZ1eDZzTzUwbHB4eVpienFvMm1TRVMwZHNYNDcvclN6ZGRoblE4QnVVCjlURHF3aDBlM0pZdGlUczM4Z21RT1pVdndEM2FnNjdDU0t1T3FNUWM3aU00S01rbmdrakxOMnhIM2luYjZxUjMKc0ZLYVluWDlMdTBZeVVZU013cGwyNjM4ZHoxanY3a05wRE8xd2p0bTh5TjdxQk00d3IrU3JNV0EyWHlhSG1hZgpBZE5hNzdxdHppL0JIcXdVTFZsbDFTSitIU1dqdHU2QmRNQTlLandzMllieWxUTm1UbmZWTzdLeVMzTFAwY2xCCm1MaEVhYS93d2J1Mm5sTWRxdDJpeTQzcE5QYmhRZ0lOck95dDR6cXhNZEVXdWtSeHAwSGFieXdFcldFWXJFQ1cKdS90ZDhKZ291QmZqZ0JDQ3hnNjNvWlJVS1ZnU1FQST0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQ==
  HTPASSWD: dXNlcm5hbWU6JDJ5JDA1JGprbU5CSm1DVTYyV0pKc0tqcWx3RC5BQmpLcUswc2R0SU9lZ29kb3VrQzFpR0owc05ENjhD


configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: docker-registry
  namespace: docker-registry
data:
  registry-config.yml: |
    version: 0.1
    log:
      fields:
        service: registry
    storage:
      delete:
        enabled: true
      cache:
        blobdescriptor: inmemory
      filesystem:
        rootdirectory: /var/lib/registry
    http:
      addr: :5000
      host: https://docker-registry:30500
      secret: asecretforlocaldevelopment
      headers:
        X-Content-Type-Options: [nosniff]
        Access-Control-Allow-Origin: ['*']
        Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
        Access-Control-Allow-Headers: ['Authorization']
        Access-Control-Max-Age: [1728000]
        Access-Control-Allow-Credentials: [true]
        Access-Control-Expose-Headers: ['Docker-Content-Digest']
      tls:
        certificate: /cert/x509/public
        key: /cert/x509/private
    auth:
      htpasswd:
        realm: basic-realm
        path: /auth/htpasswd
    health:
      storagedriver:
        enabled: true
        interval: 10s
        threshold: 3


deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
  namespace: docker-registry
spec:
  replicas: 2
  selector:
    matchLabels:
      app: registry
  template:
    metadata:
      labels:
        app: registry
    spec:
      #restartPolicy: Always
      volumes:
        - name: config
          configMap:
            name: docker-registry
            items:
              - key: registry-config.yml
                path: config.yml
        - name: cert
          secret:
            secretName: registry-tls
            items:
              - key: tls.crt
                path: public
              - key: tls.key
                path: private  
        - name: htpasswd
          secret:
            secretName: registry-tls
            items:
              - key: HTPASSWD
                path: htpasswd
        - name: registry-data
          emptyDir: {}  
      containers:
        - name: registry
          image: registry:2.7.1
          ports:
            - name: http
              containerPort: 5000
              protocol: TCP
          volumeMounts:
            - name: config
              mountPath: /etc/docker/registry
              readOnly: true
            - name: cert
              mountPath: /cert/x509
              readOnly: true
            - name: htpasswd
              mountPath: /auth
              readOnly: true
            - name: registry-data
              mountPath: /var/lib/registry


service.yml

apiVersion: v1
kind: Service
metadata:
  name: docker-registry
  namespace: docker-registry
spec:
  type: NodePort
  ports:
  - name: registryhttp
    port: 5000
    targetPort: 5000
    nodePort: 30500
  selector:
    app: registry


===== docker-compose =====

docker-compose.yml

version: '3.3'

services:
  gethpeers:
    build:
      context: gethpeers/
    image: docker-registry:30500/username/gethpeers
    volumes:
      - cronlog:/app/cronapplog:rw
      - /etc/localtime:/etc/localtime:ro
    networks:
      - fastdev

  fakelog:
    build:
      context: fakelog/
    image: docker-registry:30500/username/fakelog
    volumes:
      - cronlog:/app/cronapplog:rw
      - filebeat:/usr/share/filebeat/data:rw
    networks:
      - fastdev

volumes:  
  cronlog: 
  filebeat:
  
networks:
  fastdev:
    driver: bridge


fakelog/Dockerfile

FROM docker.elastic.co/beats/filebeat:6.5.4
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat


fakelog/filebeat.yml

filebeat.prospectors:

- type: log
  paths:
    - /app/cronapplog/*.log
  exclude_files: ['.gz$']
  fields_under_root: true
  symlinks: true

output.logstash:
  hosts: ["logstash:5044"]


cron/crontab

* * * * * /app/run-cronjob.sh /app/start.sh > /proc/1/fd/1 2>/proc/1/fd/2
#* * * * * echo hello > /proc/1/fd/1 2>/proc/1/fd/2


cron/Dockerfile

FROM debian:stretch-slim
RUN apt-get -y update && apt-get install -y cron curl jq nano iputils-ping net-tools && \
    rm -r /var/lib/apt/lists/*
ADD . /app
ADD crontab /var/spool/cron/crontabs/root
RUN chmod 0600 /var/spool/cron/crontabs/root
RUN chmod +x /app/run-cronjob.sh
RUN chmod +x /app/start.sh
CMD cron -f


cron/run-cronjob.sh

#!/bin/bash

if [ -z "$1" ] ; then
  echo "need name of cron job as first argument" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi
 
if [ ! -x "$1" ] ; then
  echo "cron job file $1 not executable, exiting" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi
 
if "$1"
then
  echo "cron job $1 Run!" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 0
else
  echo "cron job $1 failed!" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi


cron/start.sh

#!/bin/bash

# geth get admin.peers
IP_PORT=xxx.xxx.xxx.xxx.xxx
ETH_METHOD=admin_peers
PEERS=$(curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"'$ETH_METHOD'","params":[],"id":1}' $IP_PORT |  jq -c '.result[].network + {"run":"curl json"}')

printf "\n===== Now Geth Peers =====\n"
#printf "Peers: %s\n" $PEERS
echo $PEERS | jq .
#echo $PEERS >> /app/cronapplog/gethpeers.log
curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"'$ETH_METHOD'","params":[],"id":1}' $IP_PORT |  jq -c '.result[].network + {"run":"curl json"}' >> /app/cronapplog/gethpeers.log



===== push image to docker-registry =====

nano /etc/docker/daemon.json
{
  "insecure-registries" : ["docker-registry:30500"]
}
service docker restart

docker login -u username -p password docker-registry:30500
docker-compose push

nano /etc/hosts
192.168.99.118 docker-registry

check https://docker-registry:30500/v2/_catalog  
#check result
{"repositories":["username/fakelog","username/gethpeers"]}


IF get error

ERROR: blob upload unknown

when docker-compose push

Deployment replicase 2 -> 1



apiVersion: apps/v1
kind: Deployment
metadata:
  name: registry
  namespace: docker-registry
spec:
  replicas: 1


===== docker-registry ui =====
===== docker =====
docker run -d -p 80:80 -e URL=http://192.168.99.118 -e REGISTRY_URL=https://192.168.99.118:30500 -e DELETE_IMAGES=true joxit/docker-registry-ui:static

broswer http://192.168.99.118

[轉][教學] 用Drone, Kubernetes跟Helm,以及RBAC來建置你的CI/CD流程

Part 1 https://medium.com/@cloudsanchen/ci-cd-with-drone-kubernetes-and-helm-part-1-69c147046ffa

Part 2 https://medium.com/@cloudsanchen/ci-cd-with-drone-kubernetes-and-helm-part-2-65b43d790b30

part 3 https://medium.com/@cloudsanchen/%E6%95%99%E5%AD%B8-%E7%94%A8drone-kubernetes%E8%B7%9Fhelm-%E4%BB%A5%E5%8F%8Arbac%E4%BE%86%E5%BB%BA%E7%BD%AE%E4%BD%A0%E7%9A%84ci-cd%E6%B5%81%E7%A8%8B-part-3-de7273591bb

融資、融券

https://www.mobile01.com/topicdetail.php?f=291&t=5107288&p=1147#11470

上面的文章有提到融資、融券,其實這也是金融工具之一,融資說穿了就是向券商借錢,自已出40%的錢,券商出60%,所謂的融資斷頭就是股票價格跌到你自已出的錢賠光,這時券商就會強制賣出,在你持有期間你還要融資利息給券商大概4~6.x%都有可能,而且因為你槓桿放大2.5倍,你的交易手續費及交易稅也要放大2.5倍,這也是為什麼很多老手都建議不要融資玩股票,因為你很容易就會出局,而且持有的成本太高,會高過你的每年在股市中得到的現金殖利率。

融券是你付出股價九成的保證金,去放空個股,由於股價向上是沒有限制的,所以融券很容易會被軋爆,例如之前我看準放空宏碁的借券賣出兩、三年的成本介於12~14,14~16,我算準漲到26以上就會產生骨牌效應,空方軋空方,一路軋到33.x,只要軋到這價位,在這兩三年12~16元放空宏碁的人全部都得出局,這也是為啥很多版友賺到不少錢的原因,當初把空方軋到山頂上,空方不得不去回補,多不合理的價位空方都得吞,就算接下來股價跌下來,空方也沒救了,因為都已補了,錢就賠光了。

當市場上很多投資人不懂這些金融工具的弱點,所以很容易在這些金融工具的弱點下出局,但其實融資及融券也是能使用的,但前提是你的經驗夠老道,我舉個例,如果你今天可以一直在市場上賺錢,連續的賺,這時放大槓桿行不行?當然行,因為你都是常勝軍了,你投資都一直賺錢了,你當然放大槓桿也有機會能賺錢,但當你放大槓桿後,你要面對的就是較高的融資利息,及高2.5倍的交易稅及手續費,所以一般來說,融資在使用時都是短期上使用不會硬凹抱一年 ,抱兩年,抱三年的,當初我在開始賺錢後,我也是有使用過1/4金額的融資,也就是說我有150萬,我會操作200萬,當資金再變大時,就變1/10,也就是說500萬中有50萬是融資,而且這融資都是最後勝負已分時才出場的,到了資金水至1000萬以上後,我就沒有再使用過融資。

很多散戶連現股操作都贏不了錢,當面臨槓桿放大2.5倍,手續費,交易稅成本增加2.5倍,再加上持有時間愈久會產生4~6.x%的融資利息,種種不利的的因素在使用融資時一一顯現,試想一件很簡單的事,你在沒有這些不利的情況都贏不了了,更何況面對這些不利的情況下,你如何能贏,而且對持有現股的人只要基本面好,股價一時跌到哪都沒關係,但對融資戶來說,股價只要跌了3成左右,券商就會打電話來要你補錢,只要某個股價出現一兩天,不論多不合理,你就會被券商融資斷頭,斷完頭後,就算股價回升,那也不關你的事,但如果持有現股,股價一兩天的不合理低,你也不會有事,放了一年後,說不定股價就漲回來了,還賺了一年的股息(前提是基本面不變)。

融券在賺錢前我也有用過,因為使用過,所以對被軋爆及融券強制回補的規則也有所了解,我寫了這一篇的原因不是鼓勵大家使用融資或融券,而是你要了解這些金融工具,就算你不使用它,你也要了解他的優缺點,因為市場上很人會使用,你了解這些金融工具的優缺點時,你就間接的了解使用這些金融工具人的弱點,你何時該去踹它一腳讓他融資斷頭,何時該去向上拉最後一波讓他融券軋爆,當你了解他們弱點時,你就容易能抓住股價在上漲及下跌時這些人心理的變化,他們何時壓力很大,我說過,股市就是人與人之間的對戰,短線更是明顯,如果你這一些金融工具都不了解,每天就僅能幻想著股價快快漲,股價快快跌,你在對股價及局勢做判斷時就一點依據都沒有,所以準確率就會相對的低。

大家應該會發覺一件事,如果我全力在做某一檔股票時,我對股價的趨勢及判斷會相對的準確,因為那時觀察的就會很深入,會考慮融資、融券,借券,三大法人進出,權証買賣這些原因,在營收及基本面出來時,依據之前財報內容外資群會有的反應先行做預測,這些因素考慮的愈多,準確性就會愈高,最近我投入的資金水位不高,

我對於猜中美貿易戰的結果也不會有太大的興趣,我認為我的優勢在分析股個,所以猜中美貿易戰的結果這種局我就不會跟,我寧願中美貿易戰結束後,所有個股股價回到某一個水位,這時再來以基本面和別的投資者決勝負,我認為這才是我比別人有優勢的地方。

期貨,選擇權 是 股票避險

https://www.mobile01.com/topicdetail.php?f=291&t=5107288&p=1147#11469

請教 A大: 之前你提過,期貨,選擇權是給大戶,法人們避險用的,不是散戶們拿來賺零用錢. 我想很多這裡網友們跟我一樣,對'期貨,選擇權' 對應到短線上的應用應該也是很陌生.而你提供 CMoney 上的連結只是介紹 '期貨,選擇權' 的定義,其它部份並沒有作深入的探討. 可否請你,有機會,針對這個應用 '國際走勢加三大法人買貨,期貨,選擇權的進出去做判斷',給個例子,謝謝.


ans:01上還是有一些人專門是在做期貨,選擇權,期貨及選擇權如果你是婐操作(單純所有資金買期貨,沒有現貨部位),那無疑就是找死,股票中的贏家在股市中算是約一成的少數,婐操作期貨、選擇權的贏家可能1000個人中也找不到一人,其實道理不難理解,期貨及選擇權是拿來避險用的,不是拿來賭多空的,很多人想透過期貨、選擇權放大槓桿, 以期貨來說,放大槓桿最大為20倍,也就是說一個貪心的人用期貨放大槓桿到最大時,只要波動5%他就再見了,而選擇權更誇張,大概可以放大到160倍,大部份的散戶都愛用選擇權猜點數,投資當買樂透,中了就十倍,二十倍,甚至100倍的賺,錯了就全部都沒有。

我給你的cmoney投資小學堂中的期貨及選擇權只是讓你知道什麼是期貨,什麼是選擇權,當使用一項金融工具時,最基本的就是了解它的遊戲規則,例如很多人被融資斷頭,融券被強制回補,會發生這種事都是因為對這些金融工具不熟及使用不當所造成的,對外資群或法人來說,期貨及選擇權是用來保護手上現貨,因為有時局勢不明朗時,為了要保護手上現貨的獲利,就會透過期貨去避險,我舉個例,如果你有1000萬,假設你1000萬買了各大權值股,今天中美貿易戰2000億美金課了10%,川普恐赫說要把2000億美金在2019/3/1日加到25%,這時你該怎麼該?如果你是專業的基金經理人,你很注意績效,你當然不能像一般散戶坐以待斃讓上天決定自已的輸或贏,這時你當然要有一些動作,這時如果你總資金就1000萬,你都買光了,這時你能做的事就是按情勢做減碼,但交易有費用,給政府的要千分之三,買及賣各要給券商千分之1點5(各券商能有折扣),此時如果你一買一賣,這會造成你的操作成本上升,所以你當然要想一個操作成本比較低的避險方法。

這時期貨就出來了,因為可以放大槓桿20倍,也就是說,你操作資金1000萬,你買了950萬的現股,你拿50萬就能用期貨對你的現貨去做避險,因為槓桿為20倍,以期貨交易稅率為十萬分之2,買及賣十萬分之3,下圖有比較圖,買賣個股及期貨要付出的成本差了55倍,這是非常誇張的,之前我常說,你的弱點要是比別人少,你打敗別人的機率就愈高,交易成本當然也是需要考慮的因素之一,選擇權也是避險工具之一,用在短線上會有劇烈波動的情況。

大概了解一下期貨及選擇權後,這你你就要幻想一下,如果你是大部位的外資群,你要怎麼去使用這金融工具,使用的情境很多種,假設你打算要在1個月中買進1000億,這時你知道股市一定會因為你要買進的這一千億而讓指數上漲,此時你就會先去怖期貨多單,你也會去佈選擇權多單,當你買進這1000億時,股價上升,指數上升,你期貨的槓桿是20倍,選擇權是160倍。下一種情境,如果你要賣1000億,這時你也會知道股市會因為你接下來這一個月賣1000億而使指數下跌,在你開賣現貨前,你就先去佈期貨空單,再去佈選擇權空方,當你賣這一仟億現股,指數下跌時,你放空的期貨及選擇權可以彌補一些你股票賣的不漂亮的損失,另一種情境,當你現股已經賣了300億後,此時局勢不明,你害怕會漲上去,但買賣股票的成本太高,所以你就去佈期貨、選擇權多單,如果漲上去,雖然你沒有現股,但因為槓桿夠大,你還是能賺到和持有300億股票的獲利,如果期貨表現不如預期,你想硬凹,你還能用手上300億的現金去推升股價及指數。


當你了解這金融工具的使用方法後,你也知道法人在什麼情境下會去使用,這時你就能了解為什麼一般婐操作期貨、選擇權散戶輸的機會很大,外資群及法人手上有現金可以去操控指數的漲跌,外資群操作時僅是拿本金的5%當避險資金,而散戶是拿100%資金去賭方向,股市波動時,外資群手上有一大堆現貨,除了可以控制方向,也能拿來當擔保品,就算外資群整個看錯把拿來操作期貨的錢賠光,那也僅僅是賠了5%,手上的現貨放一年以台股殖利率4%來算,隨便也補得回去。

聽完後,你該了解,期貨及選擇權不能婐做了吧,當你了解期貨及選擇權的使用方法後,你只要去觀察外資群的期貨,選擇權,買賣現貨的變化,你會能看出一些端倪,

但你無法很準確的預測到轉折點

,我舉個例給你聽,如果我的部位夠大,大到左手丟300億,右手接300億這種水準,今天我左手丟300億出去,右手如果接到350億回來,那代表市場信心不足,如果我左手丟300億,右手接到200億,那代表市場信心充足,外資群何時去轉買為賣,或轉賣為買,這是不可測的,就像讓你猜我啥時會買,啥時會賣一樣,這是不可測的,

但外資群在操作時一定會有一個方向性,這是大部位的人都了解的事,當你買進50億時,你不可能明天馬上轉賣,一定是一步一步佈局上去,而在佈局的中期是很明確的,因為外資群部位很大,轉賣時也是很明顯的,像1/7到2/22日,外資群買了700億了,當外資群連續賣現貨或是期貨先減碼時,這就是徵兆。


短線可以看出一些端倪,這是沒有問題的,但是我個人比較偏好個股基本面,我個人覺得我的優勢是分析基本面,所以我不會去操作大盤,因為我認為還是存在不公平,畢竟外資群現貨,期貨、選擇權可以搭配使用,如果我的部位不夠大,持有的現貨和指數走勢不相同,這時我在使用現貨,期貨,選擇權就會輸外資群。

期貨資料參考網址

[OK!!]Docker, cron, mail and logs

https://forums.docker.com/t/running-cronjob-in-debian-jessie-container/17527/7

dkoval Mar '17

=====

docker-compose.yml


version: '3.3'

services:
  gethpeers:
    build:
      context: gethpeers/
    volumes:
      - cronlog:/app/cronapplog:rw
    networks:
      - fastdev

  fakelog:
    build:
      context: fakelog/
    volumes:
      - cronlog:/app/cronapplog:rw
      - filebeat:/usr/share/filebeat/data:rw
    networks:
      - fastdev

volumes:  
  cronlog: 
  filebeat:
  
networks:
  fastdev:
    driver: bridge

gethpeers Dockerfile Fixed


FROM debian:stretch-slim
RUN apt-get -y update && apt-get install -y cron curl jq nano && \
    rm -r /var/lib/apt/lists/*
ADD . /app
ADD crontab /var/spool/cron/crontabs/root
RUN chmod 0600 /var/spool/cron/crontabs/root
RUN chmod +x /app/run-cronjob.sh
RUN chmod +x /app/start.sh
CMD cron -f

gethpeers crontab Fixed


* * * * * /app/run-cronjob.sh /app/start.sh > /proc/1/fd/1 2>/proc/1/fd/2
* * * * * echo hello > /proc/1/fd/1 2>/proc/1/fd/2

gethpeers run-cronjob Fixed


#!/bin/bash

if [ -z "$1" ] ; then
  echo "need name of cron job as first argument" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi
 
if [ ! -x "$1" ] ; then
  echo "cron job file $1 not executable, exiting" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi
 
if "$1"
then
  echo "cron job $1 Run!" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 0
else
  echo "cron job $1 failed!" > /proc/1/fd/1 2>/proc/1/fd/2
  exit 1
fi

gethpeers start.sh


#!/bin/bash

IP_PORT=xxx.xxx.xxx.xxx:8545
ETH_METHOD=admin_peers
PEERS=$(curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"'$ETH_METHOD'","params":[],"id":1}' $IP_PORT |  jq '.result[].network + {"project":"cronapp"}')

printf "\n===== Now Geth Peers =====\n"
printf "Peers: %s\n" $PEERS
echo $PEERS >> /app/cronapplog/gethpeers.log


fakelog Dockerfile


FROM docker.elastic.co/beats/filebeat:6.5.4
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat


fakelog filebeat.yml


filebeat.prospectors:

- type: log
  paths:
    - /app/cronapplog/gethpeers.log
  exclude_files: ['.gz$']
  fields:
    srcname: "geth"
    srctype: "cron"
    filebeatserverip: "xxx.xxx.xxx.xxx"
  fields_under_root: true
  symlinks: true

output.logstash:
  hosts: ["logstash:5044"]

[Faile!!]Docker, cron, mail and logs

F............................................................................................

https://www.preining.info/blog/2018/05/docker-cron-mail-and-logs/



from debian:stretch-slim
RUN apt-get -y update
RUN apt-get install -y cron #ssmtp
ADD . /app
ADD crontab /etc/cron.d/mypackage
RUN chmod 0644 /etc/cron.d/mypackage
#ADD ssmtp.conf /etc/ssmtp/ssmtp.conf
#RUN chown root.mail /etc/ssmtp/ssmtp.conf
#RUN chmod 0640 /etc/ssmtp/ssmtp.conf
CMD cron -f

=====

docker-compose.yml


version: '3.3'

services:
  gethpeers:
    build:
      context: gethpeers/
    volumes:
      - cronlog:/app/cronapplog:rw
    networks:
      - fastdev

  fakelog:
    build:
      context: fakelog/
    volumes:
      - cronlog:/app/cronapplog:rw
      - filebeat:/usr/share/filebeat/data:rw
    networks:
      - fastdev

volumes:  
  cronlog: 
  filebeat:
  
networks:
  fastdev:
    driver: bridge

gethpeers Dockerfile


from debian:stretch-slim
RUN apt-get -y update
RUN apt-get install -y cron 
#ssmtp
ADD . /app
ADD crontab /etc/cron.d/mypackage
RUN chmod 0644 /etc/cron.d/mypackage
#ADD ssmtp.conf /etc/ssmtp/ssmtp.conf
#RUN chown root.mail /etc/ssmtp/ssmtp.conf
#RUN chmod 0640 /etc/ssmtp/ssmtp.conf
CMD cron -f

gethpeers crontab


* * * * * root /app/run-cronjob /app/start.sh

gethpeers run-cronjob


#!/bin/bash

if [ -z "$1" ] ; then
  echo "need name of cron job as first argument" >&2
  exit 1
fi
 
if [ ! -x "$1" ] ; then
  echo "cron job file $1 not executable, exiting" >&2
  exit 1
fi
 
if "$1"
then
  exit 0
else
  echo "cron job $1 failed!" 2>/proc/1/fd/2 >&2
  exit 1
fi

gethpeers start.sh


#!/bin/bash

IP_PORT=xxx.xxx.xxx.xxx:8545
ETH_METHOD=admin_peers
PEERS=$(curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"'$ETH_METHOD'","params":[],"id":1}' $IP_PORT |  jq '.result[].network + {"project":"cronapp"}')

printf "\n===== Now Geth Peers =====\n"
printf "Peers: %s\n" $PEERS
echo $PEERS >> /app/cronapplog/gethpeers.log


fakelog Dockerfile


FROM docker.elastic.co/beats/filebeat:6.5.4
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat


fakelog filebeat.yml


filebeat.prospectors:

- type: log
  paths:
    - /app/cronapplog/gethpeers.log
  exclude_files: ['.gz$']
  fields:
    srcname: "geth"
    srctype: "cron"
    filebeatserverip: "xxx.xxx.xxx.xxx"
  fields_under_root: true
  symlinks: true

output.logstash:
  hosts: ["logstash:5044"]

k8s kubernetes Lesson 4 RKE

Use RKE only one YAML config

https://itnext.io/setup-a-basic-kubernetes-cluster-with-ease-using-rke-a5f3cc44f26f

[轉]"migrating" to Kubernetes from docker-compose in homelab

https://www.reddit.com/r/docker/comments/9j2vc7/migrating_to_kubernetes_from_dockercompose_in/


If / when you're able to spawn arbitrary VMs, you can look at kubeadm, CoreOS, RKE (my current choice), and so on for cluster creation.



Before you can use kompose, or use kubectl apply -f myawesome.yaml, you first and foremost need to set up a Kubernetes cluster. This might be the most challenging thing to do because Kubernetes is heavy-weight compared to docker-compose. I recommend using RKE to set it up. Also, run away if anyone mentions Kubespray.


=====

RKE ???

YAML multi-line string

https://rancher.com/docs/rke/v0.1.x/en/config-options/add-ons/user-defined-add-ons/


To define an add-on directly in the YAML file, make sure to use the YAML’s block indicator

|-

as the addons directive is a multi-line string option. It’s possible to specify multiple YAML resource definitions by separating them using the

---

directive.

[轉]Headless CMS: REST vs JSON:API vs GraphQL

https://dri.es/headless-cms-rest-vs-jsonapi-vs-graphql?fbclid=IwAR3PJouIotZns9DnthDvr4cA-vtWiFq60opwL-dCuAjLElaflI-qj4Uw5KY#operational-efficiency

嘉能 免手洗單槽洗淨過濾魔術平板拖把

爛! 不合用!


https://media.etmall.com.tw/XML/Scrshot/20190214/150926299_2190891.jpg

爛在那:


1. 拖把只能單邊收折,意謂只能單邊進入洗桶
2. 承1. 洗桶高度非常剛好是拖版的高度,那就代表一邊進去後,另一邊的最後面是洗不到的!!……整個無言了
3. 承2. 洗桶和拖版高度一致,導致…拖把不能弄略乾,水肯定要裝蠻高的,不然洗個屁,洗完慢慢拉出來,按照水的高度,不就只有一小段是能略乾,其他段都是溼
4. 裝水時根本不知道水裝了多少??
5. 另外拖把必須要特殊使用方式,不然地上會一痕一痕,還有拖完地板很溼!

基本上比最近市面上很紅的腳踏式拖把還差!比同類型雙桶(一洗一乾)還差!比跪在地上用手擦地還浪費時間!



能想像 拖把只能洗一半的情況嗎??!!

[轉]Benchmark results of Kubernetes network plugins (CNI) over 10Gbit/s network

https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-36475925a560

ethereum-etl to csv to filebeat to kafka to mysql


filbeat to kafka

https://www.elastic.co/guide/en/beats/filebeat/current/kafka-output.html


sink-connector to mysql

https://docs.confluent.io/current/connect/kafka-connect-jdbc/sink-connector/index.html

[轉]做吃的

https://www.mobile01.com/topicdetail.php?f=747&t=5710232

我曾經是個牛肉麵 "第三代小老闆"(跑堂小弟)
自我國小5年級起!!!
從一碗小碗牛肉麵30元新台幣賣到2014年10月為止!
那年...牛肉麵一碗小碗漲賣130元
大碗賣到150元!
店租從早年每月5000元!
到最後紡寮夜市場被拆(租金當時15000元)
足足超過30年...
後來去景平路租6坪大小店面租金要8萬!!!
隨後放棄再賣牛肉麵!!!

其實!
我看到本版太多人想賣吃的賺錢!!!
但是...
麻煩一下!!!
看清楚現實!!!
俗話說..."秀才造反!三年不晚!!!"
你們想做吃的賺錢!!!
我是不反對!!!
但是有打算虧三年的心理準備嗎?

沒特色地小吃.餐廳或是飲料店!
基本上離倒店不遠!!!
坦白說...我家賣牛肉麵關門兩次...
一次是我家老闆娘生病...那次關了整整8年!
另一次是我那個無緣地越南前妻鬧政變!
那一次搞到至今無法再開店!
因為...無人可幫!!!
說沒人幫忙!太沉重...
應該說...不想把秘密流出去!
PS.別問我是否開班授徒! 答案是 NO

回頭把真實狀況想出來吧!!!
作吃地生意!
有三大影響收入問題
第一...進貨成本.
第二...開銷成本.
第三...人事成本.
這三個不解決!很難賺大錢
以牛肉麵而言...
進貨成本!
我從一箱牛肉(澳洲)2400元60磅
買到一箱牛肉(USA)6400元60磅
而每天購買小白菜從最低3元一斤到50元一斤(颱風天)
青蔥從20元一把到每把300元(颱風天)
大蒜一斤20元到一斤80元
老薑一箱30斤600元到2500元
......(還有許多)
其實沒去菜市場當"三寶"(台語.台北果菜批發市場對收尾大戶尊稱)
你永遠不知道怎樣省錢!
當時...我每天購買
20~30斤菜. 每天5把三星蔥一把蒜葉
每一星期進蒜頭20斤
每20~30天進老薑一箱
每兩個月進一箱辣椒粉與10斤花椒.
.....還有很多很多...
包括香料.醬油.糖.鹽.糯米醋.香醋.菜油...等.
每天口袋鈔票有萬元以上是要付出去!
所以!每天要有最低收入...否則開"天窗"
開銷成本.
房租!電費!瓦斯!水費!垃圾袋!(其他雜項開支)
其實這項最恐怖!
每當這項在每天收攤回家算錢作帳時!
總會發現少了點錢!
最恐怖的是...花在哪裡不知道!!!
明明辛苦賺上萬元!
怎口袋剩下4000多...要死了!!!
比較常見有...鈔票換銅板.1元.5元.10元.50元
碗盤.玻璃櫃破損.
修理冰箱.冷氣!運菜車...
人事成本
作吃的生意!!!
如果不是夫妻.兄弟.姊妹...下去做!
而且齊心齊力做!
根本無法賺錢(算薪水更恐怖.到底誰多誰少?)
因為外聘費用問題!
我從一位歐巴桑雇用3000元到最後12000元
只有洗菜.切菜.切酸菜.切豆干以及洗碗.
從早上10點坐到下午2點
另外一位是下午5點到晚上8點!
後來發現下午那一位偷錢所以開除!
以後來的都嫌髒.嫌油膩.端麵慢.收桌慢...
改為自己弄!!!
人...總是每天累翻!!!
每個月總休息兩天!(初一與十五)
因為每個月沒有收入XX萬...很難睡好覺!!!
當時!曾考慮外包麵條...
結果老客人不爽一天全又改回自己做手工麵條!
當時我家老爺高齡81歲做麵給小娃娃吃...
為的是"手工筋道"麵條
哀~~~麵粉錢也不少.
每次都要叫50袋麵粉才有便宜!
我家永遠用"駱駝" 因為該牌不偷...


請不要認為!
牛肉麵好賣...
有錢的吃的起牛肉麵.
其他都吃"牛肉湯麵"
而且來店不一定吃牛肉麵...
專賣牛肉麵 = 倒店
所以...有牛雜麵.
榨菜肉絲麵...
小菜有...
炒豆干.炒海帶.棒打黃瓜.台式泡菜.辣頭皮耳朵!!!...等
這些...材料費用也不少...

香料部分...這是秘密!
說穿...市面上都有很多賣"滷味"香料包.
從5種香料到40多種!!!
說穿了...
各家香料配方方式多少雷同或不同!
我就不說我家的...
畢竟...沒考慮外流
但香料好壞決定一鍋"滷牛肉"的好與壞!!!
打比方...
滷的好...喵公公與浪浪最先知道!
而且會排隊等著偷吃與施捨!!!
滷的不好或是用料爛!
野喵與浪浪一隻也沒看到!
更別提外面會有客人上門!!!
常見有台十三香.廣十三香與川十三香
請不要問我一堆有的沒有的!
我上面寫很"白"
請不要考慮市售餐飲用"牛肉湯包"
如果真的玩到這地步!!!
那乾脆別賣!
好吃又賺錢的牛肉麵店家
是絕對不用這些玩意!
因為一吃就知道!!!

今天就寫到這...用不著待續!
如果各位要我推薦哪家麵好吃...
口袋名單...
"老牌牛肉麵"
這是我國小三年級到國小五年級在台北打工
常去的一家...
"小雜"值得推薦!!

k8s kubernetes Lesson 3 k8s by hand

Kubernetes wiki
https://wiki.gslin.org/wiki/Kubernetes

How to Install a Kubernetes Docker Cluster on CentOS 7
https://www.howtoforge.com/tutorial/centos-kubernetes-docker-cluster/
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

https://sueboy.blogspot.com/2019/11/kubernetes-nodeport.html

https://rickhw.github.io/2019/03/17/Container/Install-K8s-with-Kubeadm/

=====
https://www.howtoforge.com/tutorial/centos-kubernetes-docker-cluster/

only one master/node k8s



yum update

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

swapoff -a

vim /etc/fstab     >> mark swap

yum install -y yum-utils device-mapper-persistent-data lvm2

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce

cat << eof > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
        https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm kubectl

sudo reboot  


systemctl start docker && systemctl enable docker
systemctl start kubelet && systemctl enable kubelet

docker info | grep -i cgroup

sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet


## kubeadm init --apiserver-advertise-address=10.0.15.10 --pod-network-cidr=10.244.0.0/16
kubeadm init --pod-network-cidr=10.244.0.0/16

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl get nodes
kubectl get pods --all-namespaces

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#control-plane-node-isolation

kubectl taint nodes --all node-role.kubernetes.io/master-

If use calico
https://docs.projectcalico.org/v3.5/getting-started/kubernetes/

DNS

https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/#are-dns-queries-being-received-processed


kubectl -n kube-system edit configmap coredns

# Add log
data:
  Corefile: |
    .:53 {
        log
        errors

PS: As 10.96.0.10 is a Cluster IP, It is not ping-able. You can use telnet or curl.

https://github.com/kubernetes/kubernetes/issues/78926#issuecomment-503898794
So use nslookup


#check DNS
注意: 不要使用busybox:latest,最高版本的nslookup工具有bug

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

kubectl exec -ti busybox -- nslookup kubernetes.default

#check DNS log
for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done

PS: If need to kubeadm reset ... see bootom

Dashboard



##### dashboard
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

#modify clusterip -> nodeport
nano kubernetes-dashboard.yaml
# ------------------- Dashboard Service ------------------- #

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30393
  selector:
    k8s-app: kubernetes-dashboard

kubectl apply -n kube-system -f kubernetes-dashboard.yaml
kubectl -n kube-system get service kubernetes-dashboard



[root@localhost ~]# kubectl -n kube-system get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.110.11.88           443:30393/TCP   103

use 30393 EX: https://192.168.99.118:30393 (192.168.99.118 is virtualbox give ip)



Dashboard ERROR NET::ERR_CERT_INVALID

https://github.com/kubernetes/dashboard/issues/2954
https://github.com/kubernetes/dashboard/wiki/Certificate-management

-subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"


mkdir certs  ( At user home path )
openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"
openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt

kubectl delete -f kubernetes-dashboard.yaml
kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
kubectl create -f kubernetes-dashboard.yaml

Try again. https://192.168.99.118:30393





Get Dashboard token

https://github.com/kubernetes/dashboard/wiki/Creating-sample-user


nano dashboard-adminuser.yaml


apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system


kubectl create -f dashboard-adminuser.yaml

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

If see admin-user token, just copy token pass to web login.

IF Get Error

try to Create ClusterRoleBinding

Create dashboard-ClusterRoleBinding.yaml



apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system



kubectl create -f dashboard-ClusterRoleBinding.yaml

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

nodePort range 1-65535



nano /etc/kubernetes/manifests/kube-apiserver.yaml

#add command

--service-node-port-range=1-65535

kubeadm reset


sudo kubeadm reset 
rm -rf .kube

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

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl get nodes
kubectl get pods --all-namespaces

kubectl taint nodes --all node-role.kubernetes.io/master-

kubectl create secret generic kubernetes-dashboard-certs --from-file=certs -n kube-system
kubectl create -f kubernetes-dashboard.yaml

## This login token
kubectl create -f dashboard-adminuser.yaml
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

kubectl create -f dashboard-ClusterRoleBinding.yaml
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

nano /etc/kubernetes/manifests/kube-apiserver.yaml
#add command
--service-node-port-range=1-65535

... follow up step


kubeadm update



kubeadm upgrade plan

kubeadm upgrade apply

kubeadm command



clear && for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done

kubectl edit cm coredns -n kube-system


coreDNS no response


coreDNS error

coreDNS work correct


How to fix? Only way is reboot OS.

1. coreDNS error 2. reboot os 3.get coreDNS work correct

[轉]Kubernetes 的失敗案例

https://blog.gslin.org/archives/2019/01/30/8707/kubernetes-%E7%9A%84%E5%A4%B1%E6%95%97%E6%A1%88%E4%BE%8B/

[轉]kubernetes failure stories

https://github.com/hjacobs/kubernetes-failure-stories

[轉]ingress-nginx & kubernetes-ingress with NGINX & nginxinc/kubernetes-ingress with NGINX Plus

https://github.com/nginxinc/kubernetes-ingress/blob/master/docs/nginx-ingress-controllers.md

F...............................



================
https://mritd.me/2017/03/04/how-to-use-nginx-ingress/

k8s kubernetes Lesson 2 yaml

https://kubernetes.github.io/ingress-nginx/examples/docker-registry/
https://sueboy.blogspot.com/2019/11/kubernetes-nodeport.html

PS:Close basic auth just remark configmap.yml auth:


    #auth:
    # htpasswd:
    #   realm: basic-realm
    #   path: /auth/htpasswd

README.md

# Docker Registry K8s

Domain:docker-registry
Port:30500
/etc/hosts  add 192.168.99.118 docker-registry  ## ip is k8s host eth2's ip
Finish command: docker login -u username -p password docker-registry:30500

https://docs.docker.com/registry/insecure/

Deploy a plain HTTP registry

```bash /etc/docker/daemon.json { "insecure-registries" : ["docker-registry:30500"] } Restart Docker for the changes to take effect ``` https://blog.csdn.net/zsd498537806/article/details/79290732 https://serverfault.com/questions/611120/failed-tls-handshake-does-not-contain-any-ip-sans http://dockone.io/article/684 #-subj "/C=/ST=/L=/O=/OU=/CN=192.168.99.118" -subj "/C=/ST=/L=/O=/OU=/CN=docker-registry" ## Generate private key & certificate ```bash openssl req -nodes -newkey rsa:4096 -keyout certs/domain.key -out certs/domain.csr -subj "/C=/ST=/L=/O=/OU=/CN=docker-registry" openssl x509 -req -sha256 -days 365 -in certs/domain.csr -signkey certs/domain.key -out certs/domain.crt #> openssl req \ # -newkey rsa:4096 -nodes -keyout certs/domain.key \ # -x509 -days 365 -out certs/domain.crt ``` ## login ID/PWD ```bash docker run --rm --entrypoint htpasswd registry:2 -Bbn username password > htpasswd ``` ## K8s Secret ```bash cat domain.crt | base64 cat domain.key | base64 ``` No bash64, just online ### domain.crt base64 ```bash LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVzRENDQXBnQ0NRRHpteitOQUZCMGRUQU5C Z2txaGtpRzl3MEJBUXNGQURBYU1SZ3dGZ1lEVlFRRERBOWsKYjJOclpYSXRjbVZuYVhOMGNua3dI aGNOTVRrd01qSTJNVEF3TlRBMldoY05NakF3TWpJMk1UQXdOVEEyV2pBYQpNUmd3RmdZRFZRUURE QTlrYjJOclpYSXRjbVZuYVhOMGNua3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdn Z0lLQW9JQ0FRRFBKcHhZK0RVQ05aMVh4Tkc0bUJlaFp2ZXZ4R21XMFdZandhRklzcFQ0L09ETWgw ZVgKRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMFdhdG5uVDc5bm5wZUVHdFNtQUJHeXMyU1hx dDZ3SzJubHJSLwowVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnNHlHSWxuZ2ZXUFBCTzkvVFhn S2Jmc2xBTk9uTXY0ckVTMlNFCkZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNiRllublZJS2l2eTdq Y0l0Q2JoelZsTHRuOHFIRE5YcElHSlpTTlYKUkdSdUVhN3ZFbUloei90blJZdFJRTmpSNGhQNkM5 eG1QMFpBZFhjQWZYMTk0aVVKNDRFYnZUZ0NKK0I4Yi9jdwpEZ29IRWxCbGtJaUtmSm9wL0RhR3B5 OUY0VjRhbHZIcnNMdFdYYTZYWmQzeGxmWWx6S2xMZ0IzTDJVQ2VCUWljCk0yUDlXMEZZZGFIR3Nj UkFyNGQvbEtiZE1PYXNDV2dXaHlGekRDMUFYQkcxdU9SSXFBbi84OTJPQnk1UVE2SDQKSk9yOXNR RGhRejVEdWZReFlGNDZUZjZUNk9MOGp6TkUrUk11YmR2RmVVS1ZwYzJXazgrVWY3UE9OdW9iRC9X ZgpTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzTU8xOFJ3UTIzU2ZFT1dMZFFseU8rYXg3STZK Vm5CbG1xaStFCk16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1A3RFdYR3JrZ2l6SloweUUveE55 dkJuLy9GeWtIYTlIdjBhUk0KNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdqWHNEb3R2R1U5VjU4 ems2S21oVGRjN3V0cE9Hb0Nud0lEQVFBQgpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUM4U1or N0V3U0liY0tDT0xoV3NvbDEzNUVIYVdiRTEzOFRRdHBVCk55aExqZXM3THVQSjg3YVdjK0NWT3VM WEdIY2FtTiszQWhKL1k3L1U5NlVCWS8yTDREUnd6b0RDYzhhQ3ZQY0oKZDhWcGxvUXJuRzRueUgx VTJUV243SXo1UDNrYjVZeE82UHlVdlNZMTJTaXBxWmVuQU1STzVQSDRlUldwbDkwbAp3cHJDVU1T NGhaL3FGVE1ORG1HSzBGS243VHZRekZrSVo1eEhUK0VncTNzcERVY1BCenV4WVdGTG9pT2ZGUFRZ CnZkSDc5Vis5K1p6T3ZBVlF3ZHhHSVlOaGlpNGd1OTg4N3Jld3RKbEZUQ1pXT05DWnNMcUw0RHBt WmJhbUlxRi8KakF5ZUR4T2kwN2VKcTlUREFLUlErZzg1NzMvR2JhVU5MVHVndzM0Z1pNZUttUnNz UjBEZWc5ckFHeXRRM2pqRApqeWJLYmo1SE8vT25xNTlGSk9rRi94eklZYWtXcjVPem1kRzJDdVhN OXhSN3BYSm5IM0RKcWUwc2FQd2ZMV2xPClF3L1RRM1lpMHg4ajhwOTRpeHZWbnRPRFRIUXBmeUFD MDloaFNmVG1sMnJXT3FqTzJ4d1dzUkhEOXBUQ0FpMG0KTHlZQS9UTVVXRWdMdklmMEZjOXRZZGkr ck9HQVJuRWdXdjdhRjhKL0pRUlZ2ZjBVL2hGTmo4bFRmY0RuOU95WQprVEtWdHNRVllqZXNBU1lI dzYyRmZoUkRIZmZRbUlscTN3emljU3MvbnBQMzZraExCZGt0TnZzakVNaE40a0JLCjR5NlJWekdZ R20rakpVQk8zV3ZQbHF0T0pwVUFCbHVCWFZOK3hhMnZOODNGYjZtMFlJTmVWbXNFQmxnVTVGT1oK a2xFVTJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= ``` ### domain.key base64 ```bash LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZB QVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFBKcHhZK0RVQ05aMVgKeE5HNG1CZWhadmV2eEdtVzBXWWp3 YUZJc3BUNC9PRE1oMGVYRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMApXYXRublQ3OW5ucGVF R3RTbUFCR3lzMlNYcXQ2d0sybmxyUi8wVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnCjR5R0ls bmdmV1BQQk85L1RYZ0tiZnNsQU5Pbk12NHJFUzJTRUZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNi RlkKbm5WSUtpdnk3amNJdENiaHpWbEx0bjhxSEROWHBJR0paU05WUkdSdUVhN3ZFbUloei90blJZ dFJRTmpSNGhQNgpDOXhtUDBaQWRYY0FmWDE5NGlVSjQ0RWJ2VGdDSitCOGIvY3dEZ29IRWxCbGtJ aUtmSm9wL0RhR3B5OUY0VjRhCmx2SHJzTHRXWGE2WFpkM3hsZllsektsTGdCM0wyVUNlQlFpY00y UDlXMEZZZGFIR3NjUkFyNGQvbEtiZE1PYXMKQ1dnV2h5RnpEQzFBWEJHMXVPUklxQW4vODkyT0J5 NVFRNkg0Sk9yOXNRRGhRejVEdWZReFlGNDZUZjZUNk9MOApqek5FK1JNdWJkdkZlVUtWcGMyV2s4 K1VmN1BPTnVvYkQvV2ZTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzCk1PMThSd1EyM1NmRU9X TGRRbHlPK2F4N0k2SlZuQmxtcWkrRU16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1AKN0RXWEdy a2dpekpaMHlFL3hOeXZCbi8vRnlrSGE5SHYwYVJNNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdq WApzRG90dkdVOVY1OHprNkttaFRkYzd1dHBPR29DbndJREFRQUJBb0lDQVFDb0FkZXliUFNKS3pU R3Q1R2tsbTRyCjhKZ1lUVU9hRjVFd2xOMmJXWU5yZ2FWTkhMYmFkMlRpQ3h2QVJISnVhaWpta3Iz V2dCNFZRMkRoWGd5Zmg3Qk0KQUZtY3F0SndkV2xjQVNYRGZkYTBRMHRVYmUxTThWcFVRSDczYVg0 K0QrNDFWdG0vN0hMTmdmN3dzV1pFSWsyZwpsd056aUgwYkw5Y0xpRVB2T0RzYlhZcE5kQnc4NTRJ R0NRcGJBbDl1bnV0bFJ0T09WR216OTJ1SHhWUzN4OFJIClRoOENoeUkxNXRkeWlid1BTam4xN2kx Rll1cktRQ0w0Qm8yTHhxd2lZazJ6VDNzVDFuVkRuSW01Tmg5MktnRnYKVEJYTkp2bzl1OGx3Z0x6 NDQzbG1mak1hbWJDd24rSlFJL0Zpdmx1UGZrbUduZEVYV3NjRGRTcGVoR2dIVVJwTwpGWURKU29j aTlGVG5NRTF4a3c4TUR5V1JjSzdvSjJrRzd0RXh4aDBML1NjK1dmY2RKVFJyRW9BR3VxNzNYdWZG Ck1CdVRoK3JCVU9ITVpSTVJMTXN6aGVTekp1SXBZU1BsNUF1VUY5cHVNd21vYkFpbXBzdmpQVEpr RlR3bytLdmQKYUVlNW5IMFlmTlRNS3JSU1YybjBaTmp0dHB3VU9VZ2lXVE9VdnJXOGNiMlVJZjRp RVk3VjJBc3ArKzVvK25QdQpZRkdiZWd0d1U3dURyNTN2YjNPRE9ZRVUrUlZmYTlScWxXMUswYlpm eGZBcCtzdVNQTHczclBiNk4xZ0UybWhFCnNUcy9FYmQ5dW5Vdm1XZ0tzdGtBeDBuRVM4Z1VqNW9Z c1F5Um1wM1NaaUJXUmlXYnZoSzRaQ3k0V3NaZUZWZEoKMEtuNDZCeXB1Sndtelozd2hRMDBZUUtD QVFFQS9XODlsa0c1eW9UVXlEZnI3M0hqMHNyZ0o3amlLdlNoZ29PVwpCck1ndkxxeEMzUVRaZjg2 VHpObnhoVDFwSS9sUnNRN2tiYjJhclpHZ3phRHlNemV2QXpYMUJiNnRkakxnVVIvCi9ZMTR1QW9V VzhYNEhrY0Rhb2xtVkFjOXdsRmpJcHVjY25YdEZJZ3NacnVydEJSQW9mSU91aUV4bzJCQkc3aUEK MW1qN2RqZlZwSTQzWWd4UHBiZndmVjV0bC9CTENMQis0RzZkclhvaExBdTlqSWlKNWw4MEEydG1q R3Z3S3lVTApHc3RGamc1MVcxTjQyTC8rY0FSQ213a3pUUTkwMFZaS1BaOUdtZTE2NndZdjl4eXds ZjN6L09udGJsZjRLaXE4ClVVQXR3RFF3bWFwN3o1OUhpckp1TEczMDk3QWRlNTZjQ1JOMk53c0Yz YTJQM09VeFVRS0NBUUVBMFQ5dHlzK24KVHdkd0JNK0lRcVBQUWt0ZjhodENSUW1Wamw0WWVZc1pt R0F2TXRqN00wYVhjcnVLT0k2VjBmc0k2T0RrbWRDSQpnZWYwUk15WXR3czdMcGtXWmIyQzlFdzk0 K3VpL2tEQVlxUUJXczBVaTQwbTdNeDgwN2pKdGZONVJad3d1MGxNCm1kR1ZSa3hkbWVtM0V6Mmhs R2ltZUMvcnB5REtiMkY1SU9Mdjk1cUdlWHBlOGNwUDhVMDd6dTdqdmdDNVRSeDcKV0pYYVVFSEt4 bjVHVHU2UUluMXQrZmw5MnRnNXprNmNjaklUeStvUG4yNWU1ZnR3ZlNaVzg1Tno2dFQzRE04bwpM Z0h4aFBNS0RzcjZySnVRSExObHI1MnY4TDlwVlZlWlpOanlmbDNxUmhqOE5zanN4OEhCczV1Z1ZF YU9MWkJTClFrU1pCYzNkYldONDd3S0NBUUFMWVhaemkrb0s5U0lWQjZYWnI5U2FQN0FIT0o4M2JK cmdJSWFaTUd3VTdaRkwKd1YrcG9lZDliUUtJKzZINFRObnY3cG42Tml3a3FLREwvYU8zWGJQVzRB REZMbTc5d1ltSitZaUIyMXVEY0RodgowcGtNeXdXVlFDeFBNN0FMVE5wVjBJVWJBcjZ0d0Z1MkZW RmxtYzg1Tm9TQXlVTFFZbDhxSG9QeW5PNUY1Y1g3ClNNT2w3SVdiSElKNUxzZGZIbFJRUkpTK0FW bWxVNm12cjZ0SVowMUNBaDUwMU5yYkRYSFFqaTVNZXJwWjRiNVYKWm84enRKTjVka2VEYk10WDk0 eTRaZGFabzlCbzB5aEU2NWMxMHB6L2IxTUlsWHlyQ3RwREVuNDRhOWhpSERYZQpnTEJrcDNOd0FB bEFoNE9McCtYN0NpbFpvdjBaQmE2eXdMdUlJT2F4QW9JQkFILytaSkppWXQwY2w1RFp3V2ZCCis4 MTVmYjhDblk3TlJnWkgySURBYlcrZnBqOWNLb3c2NmZqc2JxZ1p6OXNaeTJGbjcyMkcrWGs5QVZY ME1KWUcKOExTWVAvTUw4VWF1UEUxbW5kVVlscFcvN0hRMmJoTE96TGljZk42bGNmMHlhVVFEUG12 UmNtSEVxYUxPbzVLNgpPNW94WU56L0JwVU4rdi9JTnd2YWU5VjUrMzlocmxBd1lsTlVoWUg4MUZE SUg5YmhhbmVZckhxTGIzY1lSNGtUClJMNlRmdWNhQW1PZUVUWUVmWmVNem5XcjNDQW5sRmJabElM cFF1M0t2ZlZRaE45b1ZaWW9RVk9qTExFK1dUQ2oKU0tLOHBYSm82aEo2U2x6aE9QVlRHQ2x2NnlV UkhYU3pZOU8vSTljczFlZWZrbnI2alkyaGNpL0c5ak51c2J0dgoxVkVDZ2dFQkFJVUdEbEcxQmpP dTVhcVZ1eDZzTzUwbHB4eVpienFvMm1TRVMwZHNYNDcvclN6ZGRoblE4QnVVCjlURHF3aDBlM0pZ dGlUczM4Z21RT1pVdndEM2FnNjdDU0t1T3FNUWM3aU00S01rbmdrakxOMnhIM2luYjZxUjMKc0ZL YVluWDlMdTBZeVVZU013cGwyNjM4ZHoxanY3a05wRE8xd2p0bTh5TjdxQk00d3IrU3JNV0EyWHlh SG1hZgpBZE5hNzdxdHppL0JIcXdVTFZsbDFTSitIU1dqdHU2QmRNQTlLandzMllieWxUTm1UbmZW TzdLeVMzTFAwY2xCCm1MaEVhYS93d2J1Mm5sTWRxdDJpeTQzcE5QYmhRZ0lOck95dDR6cXhNZEVX dWtSeHAwSGFieXdFcldFWXJFQ1cKdS90ZDhKZ291QmZqZ0JDQ3hnNjNvWlJVS1ZnU1FQST0KLS0t LS1FTkQgUFJJVkFURSBLRVktLS0tLQo= ``` ### htpasswd base64 ```bash dXNlcm5hbWU6JDJ5JDA1JGprbU5CSm1DVTYyV0pKc0tqcWx3RC5BQmpLcUswc2R0SU9lZ29kb3VrQzFpR0owc05ENjhD ``` ### K8s Namespace namespace.json ```json { "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "docker-registry", "labels": { "name": "test-dev" } } } ``` ### K8s Secret secret.yml ```YAML apiVersion: v1 kind: Secret metadata: name: registry-tls namespace: docker-registry type: Opaque data: tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVzRENDQXBnQ0NRRHpteitOQUZCMGRUQU5CZ2txaGtpRzl3MEJBUXNGQURBYU1SZ3dGZ1lEVlFRRERBOWsKYjJOclpYSXRjbVZuYVhOMGNua3dIaGNOTVRrd01qSTJNVEF3TlRBMldoY05NakF3TWpJMk1UQXdOVEEyV2pBYQpNUmd3RmdZRFZRUUREQTlrYjJOclpYSXRjbVZuYVhOMGNua3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRRFBKcHhZK0RVQ05aMVh4Tkc0bUJlaFp2ZXZ4R21XMFdZandhRklzcFQ0L09ETWgwZVgKRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMFdhdG5uVDc5bm5wZUVHdFNtQUJHeXMyU1hxdDZ3SzJubHJSLwowVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnNHlHSWxuZ2ZXUFBCTzkvVFhnS2Jmc2xBTk9uTXY0ckVTMlNFCkZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNiRllublZJS2l2eTdqY0l0Q2JoelZsTHRuOHFIRE5YcElHSlpTTlYKUkdSdUVhN3ZFbUloei90blJZdFJRTmpSNGhQNkM5eG1QMFpBZFhjQWZYMTk0aVVKNDRFYnZUZ0NKK0I4Yi9jdwpEZ29IRWxCbGtJaUtmSm9wL0RhR3B5OUY0VjRhbHZIcnNMdFdYYTZYWmQzeGxmWWx6S2xMZ0IzTDJVQ2VCUWljCk0yUDlXMEZZZGFIR3NjUkFyNGQvbEtiZE1PYXNDV2dXaHlGekRDMUFYQkcxdU9SSXFBbi84OTJPQnk1UVE2SDQKSk9yOXNRRGhRejVEdWZReFlGNDZUZjZUNk9MOGp6TkUrUk11YmR2RmVVS1ZwYzJXazgrVWY3UE9OdW9iRC9XZgpTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzTU8xOFJ3UTIzU2ZFT1dMZFFseU8rYXg3STZKVm5CbG1xaStFCk16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1A3RFdYR3JrZ2l6SloweUUveE55dkJuLy9GeWtIYTlIdjBhUk0KNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdqWHNEb3R2R1U5VjU4ems2S21oVGRjN3V0cE9Hb0Nud0lEQVFBQgpNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUM4U1orN0V3U0liY0tDT0xoV3NvbDEzNUVIYVdiRTEzOFRRdHBVCk55aExqZXM3THVQSjg3YVdjK0NWT3VMWEdIY2FtTiszQWhKL1k3L1U5NlVCWS8yTDREUnd6b0RDYzhhQ3ZQY0oKZDhWcGxvUXJuRzRueUgxVTJUV243SXo1UDNrYjVZeE82UHlVdlNZMTJTaXBxWmVuQU1STzVQSDRlUldwbDkwbAp3cHJDVU1TNGhaL3FGVE1ORG1HSzBGS243VHZRekZrSVo1eEhUK0VncTNzcERVY1BCenV4WVdGTG9pT2ZGUFRZCnZkSDc5Vis5K1p6T3ZBVlF3ZHhHSVlOaGlpNGd1OTg4N3Jld3RKbEZUQ1pXT05DWnNMcUw0RHBtWmJhbUlxRi8KakF5ZUR4T2kwN2VKcTlUREFLUlErZzg1NzMvR2JhVU5MVHVndzM0Z1pNZUttUnNzUjBEZWc5ckFHeXRRM2pqRApqeWJLYmo1SE8vT25xNTlGSk9rRi94eklZYWtXcjVPem1kRzJDdVhNOXhSN3BYSm5IM0RKcWUwc2FQd2ZMV2xPClF3L1RRM1lpMHg4ajhwOTRpeHZWbnRPRFRIUXBmeUFDMDloaFNmVG1sMnJXT3FqTzJ4d1dzUkhEOXBUQ0FpMG0KTHlZQS9UTVVXRWdMdklmMEZjOXRZZGkrck9HQVJuRWdXdjdhRjhKL0pRUlZ2ZjBVL2hGTmo4bFRmY0RuOU95WQprVEtWdHNRVllqZXNBU1lIdzYyRmZoUkRIZmZRbUlscTN3emljU3MvbnBQMzZraExCZGt0TnZzakVNaE40a0JLCjR5NlJWekdZR20rakpVQk8zV3ZQbHF0T0pwVUFCbHVCWFZOK3hhMnZOODNGYjZtMFlJTmVWbXNFQmxnVTVGT1oKa2xFVTJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ== tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRRFBKcHhZK0RVQ05aMVgKeE5HNG1CZWhadmV2eEdtVzBXWWp3YUZJc3BUNC9PRE1oMGVYRXRmT0xpaUZibXFzMi93L01CeWlUSWlZczltMApXYXRublQ3OW5ucGVFR3RTbUFCR3lzMlNYcXQ2d0sybmxyUi8wVllaVEpJQ2t2amE5WExtQ2w2eEgrbFFxWVFnCjR5R0lsbmdmV1BQQk85L1RYZ0tiZnNsQU5Pbk12NHJFUzJTRUZLQzNuSTRqY1JWc1BQSUNkNDNJVlU1akNiRlkKbm5WSUtpdnk3amNJdENiaHpWbEx0bjhxSEROWHBJR0paU05WUkdSdUVhN3ZFbUloei90blJZdFJRTmpSNGhQNgpDOXhtUDBaQWRYY0FmWDE5NGlVSjQ0RWJ2VGdDSitCOGIvY3dEZ29IRWxCbGtJaUtmSm9wL0RhR3B5OUY0VjRhCmx2SHJzTHRXWGE2WFpkM3hsZllsektsTGdCM0wyVUNlQlFpY00yUDlXMEZZZGFIR3NjUkFyNGQvbEtiZE1PYXMKQ1dnV2h5RnpEQzFBWEJHMXVPUklxQW4vODkyT0J5NVFRNkg0Sk9yOXNRRGhRejVEdWZReFlGNDZUZjZUNk9MOApqek5FK1JNdWJkdkZlVUtWcGMyV2s4K1VmN1BPTnVvYkQvV2ZTRFVCYjNsSCtGVTFZalVhR0Y5VzNwSE14NXZzCk1PMThSd1EyM1NmRU9XTGRRbHlPK2F4N0k2SlZuQmxtcWkrRU16QjFHMzVTbmlMMWcyVDRkbFlIWThIbllaU1AKN0RXWEdya2dpekpaMHlFL3hOeXZCbi8vRnlrSGE5SHYwYVJNNE45OUhHRkthTmNzdkFDR2NSU2QvYUdHUDdqWApzRG90dkdVOVY1OHprNkttaFRkYzd1dHBPR29DbndJREFRQUJBb0lDQVFDb0FkZXliUFNKS3pUR3Q1R2tsbTRyCjhKZ1lUVU9hRjVFd2xOMmJXWU5yZ2FWTkhMYmFkMlRpQ3h2QVJISnVhaWpta3IzV2dCNFZRMkRoWGd5Zmg3Qk0KQUZtY3F0SndkV2xjQVNYRGZkYTBRMHRVYmUxTThWcFVRSDczYVg0K0QrNDFWdG0vN0hMTmdmN3dzV1pFSWsyZwpsd056aUgwYkw5Y0xpRVB2T0RzYlhZcE5kQnc4NTRJR0NRcGJBbDl1bnV0bFJ0T09WR216OTJ1SHhWUzN4OFJIClRoOENoeUkxNXRkeWlid1BTam4xN2kxRll1cktRQ0w0Qm8yTHhxd2lZazJ6VDNzVDFuVkRuSW01Tmg5MktnRnYKVEJYTkp2bzl1OGx3Z0x6NDQzbG1mak1hbWJDd24rSlFJL0Zpdmx1UGZrbUduZEVYV3NjRGRTcGVoR2dIVVJwTwpGWURKU29jaTlGVG5NRTF4a3c4TUR5V1JjSzdvSjJrRzd0RXh4aDBML1NjK1dmY2RKVFJyRW9BR3VxNzNYdWZGCk1CdVRoK3JCVU9ITVpSTVJMTXN6aGVTekp1SXBZU1BsNUF1VUY5cHVNd21vYkFpbXBzdmpQVEprRlR3bytLdmQKYUVlNW5IMFlmTlRNS3JSU1YybjBaTmp0dHB3VU9VZ2lXVE9VdnJXOGNiMlVJZjRpRVk3VjJBc3ArKzVvK25QdQpZRkdiZWd0d1U3dURyNTN2YjNPRE9ZRVUrUlZmYTlScWxXMUswYlpmeGZBcCtzdVNQTHczclBiNk4xZ0UybWhFCnNUcy9FYmQ5dW5Vdm1XZ0tzdGtBeDBuRVM4Z1VqNW9Zc1F5Um1wM1NaaUJXUmlXYnZoSzRaQ3k0V3NaZUZWZEoKMEtuNDZCeXB1Sndtelozd2hRMDBZUUtDQVFFQS9XODlsa0c1eW9UVXlEZnI3M0hqMHNyZ0o3amlLdlNoZ29PVwpCck1ndkxxeEMzUVRaZjg2VHpObnhoVDFwSS9sUnNRN2tiYjJhclpHZ3phRHlNemV2QXpYMUJiNnRkakxnVVIvCi9ZMTR1QW9VVzhYNEhrY0Rhb2xtVkFjOXdsRmpJcHVjY25YdEZJZ3NacnVydEJSQW9mSU91aUV4bzJCQkc3aUEKMW1qN2RqZlZwSTQzWWd4UHBiZndmVjV0bC9CTENMQis0RzZkclhvaExBdTlqSWlKNWw4MEEydG1qR3Z3S3lVTApHc3RGamc1MVcxTjQyTC8rY0FSQ213a3pUUTkwMFZaS1BaOUdtZTE2NndZdjl4eXdsZjN6L09udGJsZjRLaXE4ClVVQXR3RFF3bWFwN3o1OUhpckp1TEczMDk3QWRlNTZjQ1JOMk53c0YzYTJQM09VeFVRS0NBUUVBMFQ5dHlzK24KVHdkd0JNK0lRcVBQUWt0ZjhodENSUW1Wamw0WWVZc1ptR0F2TXRqN00wYVhjcnVLT0k2VjBmc0k2T0RrbWRDSQpnZWYwUk15WXR3czdMcGtXWmIyQzlFdzk0K3VpL2tEQVlxUUJXczBVaTQwbTdNeDgwN2pKdGZONVJad3d1MGxNCm1kR1ZSa3hkbWVtM0V6MmhsR2ltZUMvcnB5REtiMkY1SU9Mdjk1cUdlWHBlOGNwUDhVMDd6dTdqdmdDNVRSeDcKV0pYYVVFSEt4bjVHVHU2UUluMXQrZmw5MnRnNXprNmNjaklUeStvUG4yNWU1ZnR3ZlNaVzg1Tno2dFQzRE04bwpMZ0h4aFBNS0RzcjZySnVRSExObHI1MnY4TDlwVlZlWlpOanlmbDNxUmhqOE5zanN4OEhCczV1Z1ZFYU9MWkJTClFrU1pCYzNkYldONDd3S0NBUUFMWVhaemkrb0s5U0lWQjZYWnI5U2FQN0FIT0o4M2JKcmdJSWFaTUd3VTdaRkwKd1YrcG9lZDliUUtJKzZINFRObnY3cG42Tml3a3FLREwvYU8zWGJQVzRBREZMbTc5d1ltSitZaUIyMXVEY0RodgowcGtNeXdXVlFDeFBNN0FMVE5wVjBJVWJBcjZ0d0Z1MkZWRmxtYzg1Tm9TQXlVTFFZbDhxSG9QeW5PNUY1Y1g3ClNNT2w3SVdiSElKNUxzZGZIbFJRUkpTK0FWbWxVNm12cjZ0SVowMUNBaDUwMU5yYkRYSFFqaTVNZXJwWjRiNVYKWm84enRKTjVka2VEYk10WDk0eTRaZGFabzlCbzB5aEU2NWMxMHB6L2IxTUlsWHlyQ3RwREVuNDRhOWhpSERYZQpnTEJrcDNOd0FBbEFoNE9McCtYN0NpbFpvdjBaQmE2eXdMdUlJT2F4QW9JQkFILytaSkppWXQwY2w1RFp3V2ZCCis4MTVmYjhDblk3TlJnWkgySURBYlcrZnBqOWNLb3c2NmZqc2JxZ1p6OXNaeTJGbjcyMkcrWGs5QVZYME1KWUcKOExTWVAvTUw4VWF1UEUxbW5kVVlscFcvN0hRMmJoTE96TGljZk42bGNmMHlhVVFEUG12UmNtSEVxYUxPbzVLNgpPNW94WU56L0JwVU4rdi9JTnd2YWU5VjUrMzlocmxBd1lsTlVoWUg4MUZESUg5YmhhbmVZckhxTGIzY1lSNGtUClJMNlRmdWNhQW1PZUVUWUVmWmVNem5XcjNDQW5sRmJabElMcFF1M0t2ZlZRaE45b1ZaWW9RVk9qTExFK1dUQ2oKU0tLOHBYSm82aEo2U2x6aE9QVlRHQ2x2NnlVUkhYU3pZOU8vSTljczFlZWZrbnI2alkyaGNpL0c5ak51c2J0dgoxVkVDZ2dFQkFJVUdEbEcxQmpPdTVhcVZ1eDZzTzUwbHB4eVpienFvMm1TRVMwZHNYNDcvclN6ZGRoblE4QnVVCjlURHF3aDBlM0pZdGlUczM4Z21RT1pVdndEM2FnNjdDU0t1T3FNUWM3aU00S01rbmdrakxOMnhIM2luYjZxUjMKc0ZLYVluWDlMdTBZeVVZU013cGwyNjM4ZHoxanY3a05wRE8xd2p0bTh5TjdxQk00d3IrU3JNV0EyWHlhSG1hZgpBZE5hNzdxdHppL0JIcXdVTFZsbDFTSitIU1dqdHU2QmRNQTlLandzMllieWxUTm1UbmZWTzdLeVMzTFAwY2xCCm1MaEVhYS93d2J1Mm5sTWRxdDJpeTQzcE5QYmhRZ0lOck95dDR6cXhNZEVXdWtSeHAwSGFieXdFcldFWXJFQ1cKdS90ZDhKZ291QmZqZ0JDQ3hnNjNvWlJVS1ZnU1FQST0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQ== HTPASSWD: dXNlcm5hbWU6JDJ5JDA1JGprbU5CSm1DVTYyV0pKc0tqcWx3RC5BQmpLcUswc2R0SU9lZ29kb3VrQzFpR0owc05ENjhD ``` ## K8s ConfigMap configmap.yml ```YAML apiVersion: v1 kind: ConfigMap metadata: name: docker-registry namespace: docker-registry data: registry-config.yml: | 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] Access-Control-Allow-Origin: ['*'] Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] Access-Control-Allow-Headers: ['Authorization'] Access-Control-Max-Age: [1728000] Access-Control-Allow-Credentials: [true] Access-Control-Expose-Headers: ['Docker-Content-Digest'] auth: htpasswd: realm: basic-realm path: /auth/htpasswd health: storagedriver: enabled: true interval: 10s threshold: 3 ``` ## K8s Deployment deployment.yml ```YAML apiVersion: apps/v1 kind: Deployment metadata: name: registry namespace: docker-registry spec: replicas: 2 selector: matchLabels: app: registry template: metadata: labels: app: registry spec: #restartPolicy: Always volumes: - name: config configMap: name: docker-registry items: - key: registry-config.yml path: config.yml - name: htpasswd secret: secretName: registry-tls items: - key: HTPASSWD path: htpasswd - name: registry-data emptyDir: {} containers: - name: registry image: registry:2.7.1 ports: - name: http containerPort: 5000 protocol: TCP volumeMounts: - name: config mountPath: /etc/docker/registry readOnly: true - name: htpasswd mountPath: /auth readOnly: true - name: registry-data mountPath: /var/lib/registry ``` ## K8s Service service.yml ```YAML apiVersion: v1 kind: Service metadata: name: docker-registry namespace: docker-registry spec: type: ClusterIP ports: - name: http protocol: TCP port: 5000 targetPort: 5000 selector: app: registry ``` ## K8s Ingress ingress.yml ```YAML apiVersion: extensions/v1beta1 kind: Ingress metadata: name: docker-registry namespace: docker-registry annotations: #kubernetes.io/ingress.class: nginx #ingress.kubernetes.io/rewrite-target: / #nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" #certmanager.k8s.io/issuer: acme-issuer spec: #tls: #- hosts: # - tt.t # secretName: registry-tls rules: - host: tt.t http: paths: - backend: serviceName: docker-registry servicePort: 5000 path: / #- path: /foo # backend: # serviceName: service1 # servicePort: 4200 ```


yml



kubectl create -f xxx.yml
kubectl edit xxx ooo

example:


kubectl create -f secret.yml
kubectl edit secrets --namespace=docker-registry
kubectl edit secrets registry-tls --namespace=docker-registry

kubectl create -f configmap.yml
kubectl edit configmap --namespace=docker-registry
kubectl edit configmap docker-registry --namespace=docker-registry


PS

containers.volumeMounts mount path must different path. Same path get error: .mountPath: Invalid value: ooxxooxx : must be unique

So configmap


auth.htpasswd.path /etc/docker/registry/htpasswd -> /auth/htpasswd


Vaild


1. check Pod realy get config.yml & htpasswd is ok or not? Pod ip use minikube dashboard website more easy.

> minikube ssh
> curl -v -XGET -u username:password http://172.17.xxx.xxx:5000/v2/_catalog

get 200 OK.


2. Check Service is ok or not ? Service ip use minikube dashboard website more easy.


> minikube ssh
> curl -v -XGET -u username:password http://10.99.xxx.xxx:5000/v2/_catalog

get 200 OK.


3. 2. Check Ingress is ok or not ? Ingress ip use minikube dashboard website more easy.


> minikube ssh
> curl -v -XGET -u username:password http://10.0.xxx.xxx:5000/v2/_catalog

get 200 OK.


========

Ingress

have problems with windows minikube. So now check list:

1、Use it is ingress-nginx
https://kubernetes.github.io/ingress-nginx/deploy/

2、On ingress-nginx deploy minikube

Don't USE


kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

USE


minikube addons enable ingress

Because nginx-control already be create by "minikube addons enable ingress". Check use

kubectl get pods --all-namespaces -l app.kubernetes.io/name=nginx-ingress-controller

PS:Use mandatory.yaml be create ingress-nginx namespace. Use minikube addons be put in kube-system namespace.


https://medium.com/@Oskarr3/setting-up-ingress-on-minikube-6ae825e98f82

Enabling the add-on provisions the following:

.a configMap for the Nginx loadbalancer
.the Nginx ingress controller
.a service that exposes a default Nginx backend pod for handling unmapped requests.

Best Important!!

Use nginx-ingress that let everything pass nginx-ingress. Thinking Way now is "path" or "domain" to "k8s service"
Here use "domain" to "k8s service docker-registry"
EX: tt.t -> nginx-ingress -> service(docker-registry)

Windows use notepad(administrator mode) change C:\Windows\System32\drivers\etc\hosts
192.168.99.xxx tt.t

Run curl

curl -v -XGET -u username:password http://tt.t/

get 200. ok

Best Important!!

Use TLS just remove mark TLS insdie ingress.yml.

Run curl

curl -v -XGET -u username:password https://tt.t/

But maybe get cert can't correct.

Best Important!!


ingress Only domain or path, So http & https. Can't custom port.

https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0

Maybe

you try to edit Deployments -> nginx-ingress-controller YAML

add custom Port

"ports": [
  ...,
  {
    "hostPort": 5000,
    "containerPort": 5000,
    "protocol": "TCP"
  }
]

Yes, This edit get No error, but ingress

can't

accept custom port

rules:
  - http:
    port: 5000
      paths:
      - backend:
          serviceName: docker-registry
          servicePort: 5000
        path: /

Or

maybe you think Deployments -> nginx-ingress-controller YAML add name for Port. EX:registryhttp 5000
But ingress

can't

accept registryport

rules:
  - registryhttp:
      paths:
      - backend:
          serviceName: docker-registry
          servicePort: 5000
        path: /


Other way is LoadBalancer

But only nodePort



apiVersion: v1
kind: Service
metadata:
  name: docker-registry-lb
  namespace: docker-registry
spec:
  type: LoadBalancer
  ports:
  - name: registryhttp
    port: 5000
    targetPort: 5000
    nodePort: 30500
  selector:
    app: registry


apiVersion: v1
kind: Service
metadata:
  name: docker-registry
  namespace: docker-registry
spec:
  type: NodePort
  ports:
  - name: registryhttp
    port: 5000
    targetPort: 5000
    nodePort: 30500
  selector:
    app: registry

Port 5000 still

can't use

Only Port 30500 can use



maybe you think

Use "selector" to focus nginx-ingress-controller

Answer is can't, because ingress only http & https


OK, some demo add port on tcp-services (configmap)
https://kubernetes.github.io/ingress-nginx/user-guide/exposing-tcp-udp-services/
https://yq.aliyun.com/articles/603225


apiVersion: v1
data:
  "9000": docker-registry/docker-registry:5000
kind: ConfigMap
metadata:
  creationTimestamp: "2019-01-30T05:24:36Z"
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: tcp-services
  namespace: kube-system
  resourceVersion: "256144"
  selfLink: /api/v1/namespaces/kube-system/configmaps/tcp-services
  uid: 552a9b32-244f-11e9-b70e-080027bbc6ea
.........................................................N o ..... U s e

Default backend Test

https://kubernetes.github.io/ingress-nginx/user-guide/default-backend/

./healthz that returns 200
./ that returns 404

k8s kubernetes Lesson 1 windows

1、install Virtualbox

2、donwload & rename minikube.exe & move minikube.exe put file on path C:\minikube
add path to system PATH

https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exe



3、download kubectl.exe put file on path C:\minikube

https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/windows/amd64/kubectl.exe

4、minikube start

5、check virtualbox have new minikube

PS:Don't start minikube with Virtualbox UI. Use cmd >minikube start


6、Run

> minikube dashboard


7、Get IP

> minikube ip

docker registry

1. create htpasswd


docker run --rm --entrypoint htpasswd registry:2 -Bbn username password > htpasswd
docker run --rm --entrypoint htpasswd registry:2 -Bbn test test > htpasswd

htpasswd file inside have two records: username & test


2. create registry_config.yml


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]
    Access-Control-Allow-Origin: ['*']
    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
    Access-Control-Allow-Headers: ['Authorization']
    Access-Control-Max-Age: [1728000]
    Access-Control-Allow-Credentials: [true]
    Access-Control-Expose-Headers: ['Docker-Content-Digest']
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/htpasswd

Access-Control-Allow-Origin can change you want.


3. run docker


docker run -d -p 5000:5000 --restart=always --name registry-srv \
           -v $(pwd)/registry_data:/var/lib/registry \
           -v $(pwd)/registry_config.yml:/etc/docker/registry/config.yml \
           -v $(pwd)/htpasswd:/etc/docker/registry/htpasswd \
           registry:2.7.1


4. test docker registry


#Auth test foo:bar bas64=>Zm9vOmJhcg==
curl -k -v -H "Authorization: Basic Zm9vOmJhcg==" http:/xxx.xxx.xxx.xxx:5000/v2/

#Auth test test:test bas64=>dGVzdDp0ZXN0
curl -k -v -H "Authorization: Basic dGVzdDp0ZXN0" http://xxx.xxx.xxx.xxx:500/v2/
curl -v -XGET -u test:test http://xxx.xxx.xxx.xxx:5001/v2/_catalog

Auth ok -> 200 code

Then change user & password or token, get 401 code.


https://ithelp.ithome.com.tw/articles/10191285?sc=iThelpR
https://www.base64encode.org/
https://medium.com/@lvthillo/deploy-a-docker-registry-using-tls-and-htpasswd-56dd57a1215a
https://github.com/Joxit/docker-registry-ui
https://ithelp.ithome.com.tw/articles/10191213

hyper/docker-registry-web

[轉]EKS 最主要是為了改善維護及升級 k8s cluster 的困難度 Kubernetes

https://kkc.github.io/2018/10/04/EKS-notes/


為什麼需要 EKS

最主要是為了改善維護及升級 k8s cluster 的困難度,一般來說,自己維護的 k8s cluster 必需要很注意 master 的穩定性,而其他痛苦的地方像是升級 kubernetes version (master node),etcd 的升級,etcd 的備份和還原,另外還有些問題像是有些人忘了更新 certificate ,超過了過期時間後,連不進 master node 的意外。所以在沒有一定大小程度的 kubernetes operation 團隊下,其實蠻推薦大家使用 managed k8s 像是 EKS, GKE, AKS 等等的 solution ,減少其心智負擔。

ethereum etl ELK docker docker-compose .env startblock endblock

ethereum-etl export data every time write over file. Filebeat always reload file then ELK receive repeat records...

So

.env


STARTBLOCK=01205866
ENDBLOCK=01205888


startetl.sh

IP_PORT is go-ethereum-node1 outside ip & port. here is docker-machine
source get file that path need to be careful

#!/bin/bash

IP_PORT=192.168.99.100:18545
ETH_METHOD=eth_blockNumber
BLOCKNUMBER_JSON_HEX=$(curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"'$ETH_METHOD'","params":[],"id":1}' $IP_PORT | jq '.result' | tr -d '"')
BLOCKNUMBER_DEX=$(printf "%08d\n" $BLOCKNUMBER_JSON_HEX)

printf "\n===== Now Geth BlockerNumber =====\n"
printf "HEX: %s\n" $BLOCKNUMBER_JSON_HEX
printf "DEC: %s\n" $BLOCKNUMBER_DEX

source .env
#source ~/ethereum_etl/.env

printf "\n===== .env BLOCK VARS =====\n"
printf "STARTBLOCK: %s\n" $STARTBLOCK
printf "ENDBLOCK: %s\n" $ENDBLOCK

if [[ $BLOCKNUMBER_DEX =~ ^?[0-9]+$ ]] || [ -z $BLOCKNUMBER_DEX ]; then
  printf "NOT Number Geth BLOCKNUMBER, check Geth\n"
  exit
fi

if [[ $STARTBLOCK =~ ^?[0-9]+$ ]] || [ -z $STARTBLOCK ]; then
  printf "NOT Number .env STARTBLOCK, check .env\n"
  exit
fi

if [[ $ENDBLOCK =~ ^?[0-9]+$ ]] || [ -z $ENDBLOCK ]; then
  printf "NOT Number .env ENDBLOCK, check .env\n"
  exit
fi

#printf "\n%s\n" $BLOCKNUMBER_DEX
#printf "%s" $STARTBLOCK
#printf "\n%s\n" $((10#$BLOCKNUMBER_DEX - 10#$STARTBLOCK))

if (( (( 10#$BLOCKNUMBER_DEX - 10#$STARTBLOCK -1 )) > 0 )); then
  printf "\n===== Change .env =====\n"
  printf "startblock: %s => %s\n" $STARTBLOCK $((10#$ENDBLOCK+1))
  printf "endblock: %s => %s\n" $ENDBLOCK $BLOCKNUMBER_DEX  

  STARTBLOCK=$(printf "%08d\n" $((10#$ENDBLOCK+1)) )
  echo STARTBLOCK=$STARTBLOCK > ~/ethereum_etl/.env
  echo ENDBLOCK=$BLOCKNUMBER_DEX >> .env
  #echo STARTBLOCK=$STARTBLOCK > ~/ethereum_etl/.env
  #echo ENDBLOCK=$BLOCKNUMBER_DEX >> ~ethereum_etl/.env
fi

docker-compose up --build ethereum_etl



docker-compose.yml


version: '3.3'

services:
  go-ethereum-node1:
    build:
      context: go-ethereum-node1/
    volumes:
      #- ./go-ethereum/keystore:/root/.ethereum/devchain/keystore:rw
      - ./go-ethereum-node1/genesis/poa_for_dev.json:/root/genesis/poa_for_dev.json:ro
      - alldata:/root/.ethereum/devchain
      - /etc/localtime:/etc/localtime:ro
      #- ./go-ethereum/log:/root/log:rw
    entrypoint: /root/start.sh
    ports:
      - "18545:8545"
      - "30313:30303"
      - "30313:30303/udp"
    networks:
      - etl

  ethereum_etl:
    build:
      context: ethereum-etl/
    env_file: .env
    volumes:
      - alldata:/ethereum-etl/output:rw
      #- /root/go/src/github.com/ethereum/go-ethereum/build/bin/data:/ethereum-etl/ipc
    #restart: unless-stopped
    networks:
      - etl

volumes:  
  alldata: 

networks:
  etl:
    driver: bridge



ethereum_etl DOCKERFILE


FROM python:3.6-alpine
MAINTAINER Eric Lim 
ENV PROJECT_DIR=ethereum-etl

RUN apk add unzip
RUN wget https://github.com/blockchain-etl/ethereum-etl/archive/develop.zip \
&& unzip develop.zip && rm develop.zip

RUN mv ethereum-etl-develop /$PROJECT_DIR

WORKDIR /$PROJECT_DIR
RUN apk add --no-cache gcc musl-dev  #for C libraries:  
RUN pip install --upgrade pip && pip install -e /$PROJECT_DIR/

#CMD ["export_all", "-s", "01990000", "-e", "99999999", "-p", "http://xxx.xxx.xxx.xxx:8545", "-o", "output"]
#CMD ["sh","-c", "echo startblock=$STARTBLOCK  endblock=$ENDBLOCK"]

CMD ["sh","-c","python ethereumetl export_all -s $STARTBLOCK -e $ENDBLOCK  -p http://xxx.xxx.xxx.xxx:8545 -o output"]


go-ethereum-node1

see https://sueboy.blogspot.com/search?q=poa

elk oss kibana error docker



 {"type":"log","@timestamp":"2019-01-21T08:57:51Z","tags":["status","plugin:elasticsearch@6.5.2","error"],"pid":1,"state":"red","message":"Status changed from yellow to red - Request Timeout after 3000ms","prevState":"yellow","prevMsg":"Waiting for Elasticsearch"}

1. First use oss
FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.2
FROM docker.elastic.co/kibana/kibana-oss:6.5.2

So Not X-pack problem

2. Truly Problem is connect to elasticsearch failed
Even login kibana docker then ping elasticsearch docker that get response. But kibana logs always get this error message.
kibana website message "Kibana server is not ready yet"

Try to get docker elasticsearch ip, change docker kibana.yml like example:


#elasticsearch.url: http://elasticsearch:9200
elasticsearch.url: http://172.19.0.2:9200


docker-compose up --build  # sure image rebuild

docker iptables part 3

https://morphyhu.szitcare.com/wordpress/?p=1314

New docker use DOCKER-USER

Important!!

check host route & login docker container check route. and iptables -L -t nat POSTROUTING MASQUERADE 172.17.0.0/16 must same submask. EX:
host route have 172.17.0.0, 172.18.0.0, 172.19.0.0, 172.20.0.0
docker insdie route use 172.18.0.0
iptables MASQUERADE use 172.17.0.0
Docker Internet is failed.
So add iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -o docker0 -j MASQUERADE



#启动后默认增加的规则
iptables -N DOCKER
iptables -N DOCKER-ISOLATION-STAGE-1
iptables -N DOCKER-ISOLATION-STAGE-2
iptables -N DOCKER-USER
iptables -t nat -N DOCKER
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
iptables -t nat -A DOCKER -i docker0 -j RETURN
iptables -A FORWARD -j DOCKER-USER
iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o docker0 -j DOCKER
iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
iptables -A DOCKER-USER -j RETURN
 
#docker run --name smokeping -d -p 82:80 -e PUID=1000 -e PGID=1000 -e TZ=Asia/Shanghai -v /data/smokeping/data:/data -v /data/smokeping/config:/config linuxserver/smokeping 
#启动上述镜像后默认增加的规则
iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 82 -j DNAT --to-destination 172.17.0.2:80
iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

sudo iptable



#启动后默认增加的规则
sudo iptables -N DOCKER
sudo iptables -N DOCKER-ISOLATION-STAGE-1
sudo iptables -N DOCKER-ISOLATION-STAGE-2
sudo iptables -N DOCKER-USER
sudo iptables -t nat -N DOCKER
sudo iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
sudo iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
sudo iptables -t nat -A DOCKER -i docker0 -j RETURN
sudo iptables -A FORWARD -j DOCKER-USER
sudo iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1
sudo iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -o docker0 -j DOCKER
sudo iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
sudo iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
sudo iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
sudo iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN
sudo iptables -A DOCKER-USER -j RETURN
 
#docker run --name smokeping -d -p 82:80 -e PUID=1000 -e PGID=1000 -e TZ=Asia/Shanghai -v /data/smokeping/data:/data -v /data/smokeping/config:/config linuxserver/smokeping 
#启动上述镜像后默认增加的规则
iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 82 -j DNAT --to-destination 172.17.0.2:80
iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT


iptables-save


# Generated by iptables-save v1.4.21 on Mon Jan 21 14:26:28 2019
*nat
:PREROUTING ACCEPT [76:8149]
:INPUT ACCEPT [19:1447]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Mon Jan 21 14:26:28 2019
# Generated by iptables-save v1.4.21 on Mon Jan 21 14:26:28 2019
*filter
:INPUT ACCEPT [70:5722]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [42:4460]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
COMMIT
# Completed on Mon Jan 21 14:26:28 2019


iptables -S


-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

elasticsearch dump ethereum-etl

https://github.com/taskrabbit/elasticsearch-dump


Output elasticsearch->json

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-logs   --output=/tmp/etl-logs.json   --type=mapping

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-transactions  --output=/tmp/etl-transactions.json   --type=mapping

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-receipts  --output=/tmp/etl-receipts.json   --type=mapping

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-contracts  --output=/tmp/etl-contracts.json   --type=mapping

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-blocks  --output=/tmp/etl-blocks.json   --type=mapping


docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-logs   --output=/tmp/etl-logs-data.json   --type=data

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-transactions   --output=/tmp/etl-transactions-data.json   --type=data

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-receipts   --output=/tmp/etl-receipts-data.json   --type=data

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-contracts   --output=/tmp/etl-contracts-data.json   --type=data

docker run --rm -ti -u root -v /mnt/sda1/var/lib/docker/volumes/xxxxxxx/_data/data:/tmp taskrabbit/elasticsearch-dump   --input=http://192.168.99.101:9200/filebeat-6.5.4-etl-blocks   --output=/tmp/etl-blocks-data.json   --type=data



Innput json->elasticsearch

docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-contracts.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-contracts   --type=mapping
docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-contracts-data.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-contracts   --type=data

docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-receipts.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-receipts   --type=mapping
docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-receipts-data.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-receipts   --type=data

docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-transactions.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-transactions   --type=mapping
docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-transactions-data.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-transactions   --type=data

docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-blocks.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-blocks   --type=mapping
docker run --rm -ti -u root -v data:/tmp taskrabbit/elasticsearch-dump   --input=/tmp/etl-blocks-data.json  --output=http://xxx.xxx.xxx.xxx:9200/filebeat-6.5.4-etl-blocks   --type=_data

clover 4458 mac hardware testing

https://www.tonymacx86.com/threads/solved-clover-boot-way-too-long.245889/
https://themacadmin.com/2012/02/15/mounting-the-efi-boot-partition-on-mac-os-x/

diskutil ls

EFI EFI                     209.7 MB   disk0s1


sudo mount -t msdos /dev/disk0s1 /Volumes/efi


外資估算

https://www.mobile01.com/topicdetail.php?f=291&t=5107288&p=1103#11022

所以你與其想了解美林這算法的原理,倒不如你去觀察美林進出宏碁的成本,我記得之前我都有追蹤過,只是時間太久了,大部份的人也都忘了,所謂的研究、觀察、記錄是要找出個股中誰說的算,如果自已是小咖,那就要摸清你有興趣個股中大咖人在想什麼,他們相信什麼,他們對什麼財報、什麼消息買單,很多人喜歡用一套方法套到所有的股票中,我說過,這是沒有用的,雖有找出個股中贏家在想啥,你順著他做,最終那一套方法就是準則


https://www.mobile01.com/topicdetail.php?f=291&t=5107288&p=1103#11024


ans:那個...在這個版這麼久了,你還是搞不清楚這種事嗎?任何人都能用不同的觀點去估股價合理性,但重點是在於,這個人夠不夠力,如果美林這兩三年買了二十萬張,今天他用淨現金比較去估16元,如果大家不信,他就把這二十萬張股價倒出來,倒到股價到16元為止,這時你就會發覺,美林估的好準哦,如果此時,台灣摩根士認為宏碁淨值19元,一年賺1元,願意給宏碁3年眼光費,所以值22元,這時美林和台灣摩根士就比看看誰比較大咖,美林倒1萬張,台灣摩根士接1萬張,此時股價不跌,美林再倒5萬張,台灣摩根士再接5萬張,此時股價還是不跌,美林all out 20萬張,台灣摩根士嚇到,並且手上也沒有這麼多資金,這時美林就獲勝,這時就是美林說的算。

Golang で Vault を操作

https://christina04.hatenablog.com/entry/vault-login-golang


user passwd get token
https://www.vaultproject.io/docs/auth/userpass.html


setting token
https://www.vaultproject.io/docs/auth/token.html

elk kibana search geth ethereum

https://blog.csdn.net/qq_38486203/article/details/80817037

Search minedNumber

GET /filebeat-6.*-geth*/_search?q=geth_ip:xxx.xxx.xxx.xxx
{
  "_source": ["name", "minedNumber", "gethdate"],
  "sort": [
    {
      "gethdate": {
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 1
}



Get minedNumber

curl -XGET "http://xxx.xxx.xxx.xxx:9200/filebeat-6.*-geth*/_search?q=geth_ip:xxx.xxx.xxx.xxx" -H 'Content-Type: application/json' -d'
{
  "_source": ["name", "minedNumber", "gethdate"],
  "sort": [
    {
      "gethdate": {
        "order": "desc"
      }
    }
  ],
  "from": 1,
  "size": 1
}' |  jq ".hits.hits[]._source.minedNumber"

ethereum-etl ethereumetl docker part2 use .env


docker-compose.yml

version: '3.3'

services:
  ethereum_etl:
    build:
      context: .
    env_file: .env
    volumes:
      - /var/log/hardblue/etl/:/ethereum-etl/output:rw
      #- /root/go/src/github.com/ethereum/go-ethereum/build/bin/data:/ethereum-etl/ipc
    #restart: unless-stopped
    networks:
      - etl

networks:
  etl:
    driver: bridge

.env

STARTBLOCK=00000000

DOCKERFILE

FROM python:3.6-alpine
MAINTAINER Eric Lim 
ENV PROJECT_DIR=ethereum-etl

RUN apk add unzip
RUN wget https://github.com/blockchain-etl/ethereum-etl/archive/develop.zip \
&& unzip develop.zip && rm develop.zip

RUN mv ethereum-etl-develop /$PROJECT_DIR

WORKDIR /$PROJECT_DIR
RUN apk add --no-cache gcc musl-dev  #for C libraries:  
RUN pip install --upgrade pip && pip install -e /$PROJECT_DIR/

#CMD ["export_all", "-s", "01990000", "-e", "99999999", "-p", "http://xxx.xxx.xxx.xxx:8545", "-o", "output"]
#CMD ["sh","-c", "echo startblock=$STARTBLOCK  endblock=$ENDBLOCK"]

CMD ["sh","-c","python ethereumetl export_all -s $STARTBLOCK -e $ENDBLOCK  -p http://xxx.xxx.xxx.xxx:8545 -o output"]

crontab -e

#!/bin/sh

cd /docker-compose directory/ethereum_etl
docker-compose up

PS:First docker-compose build. Use docker-compose up, don't use docker-compose start that can't import .env STARTBLOCK

[轉]ELK日志系统优化过程之Elasticsearch优化

https://fwit.win/?p=1392

kibana geo_point How to Part 6


Kibana Dev Tools


GET _cat
GET _cat/indices?v
GET _cat/indices?v&s=index
GET _cat/segments?v

GET /_settings
GET /_stats
GET /_template
GET _cluster/health

GET filebeat-6.5.1-2019.01.01
POST filebeat-6.5.1-2019.01.01 
PUT filebeat-6.5.1-2019.01.01 
DELETE filebeat-6.5.1-2019.01.01 

GET filebeat-6.5.1-2019.01.*
POST filebeat-6.5.1-2019.01.*
PUT filebeat-6.5.1-2019.01.* 
DELETE filebeat-6.5.1-2019.01.*

GET filebeat-6.5.1-2019.01.01/_stats
GET filebeat-6.5.1-2019.01.01/_mapping

POST /_refresh
POST /_cache/clear
POST /_flush/synced

?v

show column name


Segments Merge

https://my.oschina.net/fufangchun/blog/1541156
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-forcemerge.html#forcemerge-multi-index


GET _cat/segments?v

POST /filebeat-6.5.1-2019.01.01/_forcemerge?max_num_segments=1&flush=true



https://my.oschina.net/weiweiblog/blog/2989931