0%

k9s

intro

  • cli 版的 k8s 介面 k9s
  • 簡單的操作
  • 查看不同資源
    • 看 pods
      • :pods
    • 檢視服務
      • :svc or :service
    • 檢視部署
      • :deploy
    • 檢視權限RBAC
      • :rb
    • 檢視命名空間
      • :namespace
    • 檢視排程
      • :cj
  • 搜尋
    • 假設你有 POD 在 k9s 清單中,你應該要怎麼搜尋呢?
    • 首先你只要在 POD list 的畫面,按下 /,就會如以下畫面
  • namespace 切換
    • k9s namespace 切換有兩種方式,一種是在進入 k9s 之前輸入
    • $ k9s -n {your_namespace}
    • 另一種方式就是進入後按下 : 並且輸入 namespace,按下 enter 就會出現如下圖
  • port-foward
    • 回到上面的 POD list 然後隨意進入任一個 POD 裡面,找到你想要 port-foward 的 container,按下 shift + f,就會出現如下了喔
  • 獲取幫助
    • K9s 自帶了許多快捷鍵,可以通過輸入 ? 獲取幫助。

shortcut

  • enter: 可以看到pod裡面的container資訊,要回到原本pod list畫面只要按esc就能回去
  • ctrl+c: 為結束k9s指令
  • l : logs,其實還有一個方法,一直按enter就可以看到log
Action Command Comment
Show active keyboard mnemonics and help ?
Show all available aliases and resources on the cluster ctrl-a or :alias
To bail out of K9s :q, ctrl-c
View a Kubernetes resource using singular/plural or short-name :po⏎ accepts singular, plural, short-name or alias ie pod or pods
View a Kubernetes resource in a given namespace :alias namespace⏎
Filter out a resource view given a filter /filter⏎ Regex2 supported ie `fred
Inverse regex filer /! filter⏎ Keep everything that doesn’t match. Not implemented for logs.
Filter resource view by labels /-l label-selector⏎
Fuzzy find a resource given a filter /-f filter⏎
Bails out of view/command/filter mode <esc>
Key mapping to describe, view, edit, view logs,… d,v, e, l,…
To view and switch to another Kubernetes context :ctx⏎
To view and switch to another Kubernetes context :ctx context-name⏎
To view and switch to another Kubernetes namespace :ns⏎
To view all saved resources :screendump or sd⏎
To delete a resource (TAB and ENTER to confirm) ctrl-d
To kill a resource (no confirmation dialog!) ctrl-k
Toggle Wide Columns ctrl-w Equivalent to kubectl ... -o wide
Toggle Error State ctrl-z View resources in error condition
Launch pulses view :pulses or pu⏎
Launch XRay view :xray RESOURCE [NAMESPACE]⏎ RESOURCE can be one of po, svc, dp, rs, sts, ds, NAMESPACE is optional
Launch Popeye view :popeye or pop⏎ See https://popeyecli.io

Reference

Kubernetes (k8s)

  • Kubernetes (有時會使用縮寫 K8s,8 是 K 到 s 中間的英文字母個數) 是開放原始碼系統,可在任何位置部署、擴充及管理容器化的應用程式。
  • Kubernetes(K8S)是一個可以幫助我們管理微服務(microservices)的系統,他可以自動化地部署及管理多台機器上的多個容器(Container)。
  • 更進一步地說,Kubernetes 想解決的問題是:「手動部署多個容器到多台機器上並監測管理這些容器的狀態非常麻煩。」而 Kubernetes 要提供的解法: 提供一個平台以較高層次的抽象化去自動化操作與管理容器們。

intro

  • 同時部署多個容器到多台機器上(Deployment)
  • 服務的乘載量有變化時,可以對容器做自動擴展(Scaling)
  • 管理多個容器的狀態,自動偵測並重啟故障的容器(Management)

Kubernetes 四元件

Pod

  • Kubernetes 運作的最小單位,一個 Pod 對應到一個應用服務(Application)
    • 每個 Pod 都有一個身分證,也就是屬於這個 Pod 的 yaml
    • 一個 Pod 裡面可以有一個或是多個 Container,但一般情況一個 Pod 最好只有一個 Container
    • 同一個 Pod 中的 Containers 共享相同資源及網路,彼此透過 local port number 溝通

Worker Node

  • Kubernetes 運作的最小硬體單位,一個 Worker Node(簡稱 Node)對應到一台機器,可以是實體機如你的筆電、或是虛擬機如 AWS 上的一台 EC2 或 GCP 上的一台 Computer Engine。
  • 每個 Node 中都有三個組件:kubelet、kube-proxy、Container Runtime。
    • kubelet
      • 該 Node 的管理員,負責管理該 Node 上的所有 Pods 的狀態並負責與 Master 溝通
    • kube-proxy
      • 該 Node 的傳訊員,負責更新 Node 的 iptables,讓 Kubernetes 中不在該 Node 的其他物件可以得知該 Node 上所有 Pods 的最新狀態
    • Container Runtime
      • 該 Node 真正負責容器執行的程式,以 Docker 容器為例其對應的 Container Runtime 就是 Docker Engine

        Master Node

  • Kubernetes 運作的指揮中心,可以簡化看成一個特化的 Node 負責管理所有其他 Node
  • 一個 Master Node(簡稱 Master)中有四個組件:kube-apiserver、etcd、kube-scheduler、kube-controller-manager。
    • kube-apiserver
      • 管理整個 Kubernetes 所需 API 的接口(Endpoint),例如從 Command Line 下 kubectl 指令就會把指令送到這裏
      • 負責 Node 之間的溝通橋樑,每個 Node 彼此不能直接溝通,必須要透過 apiserver 轉介
      • 負責 Kubernetes 中的請求的身份認證與授權
    • etcd
      • 用來存放 Kubernetes Cluster 的資料作為備份,當 Master 因為某些原因而故障時,我們可以透過 etcd 幫我們還原 Kubernetes 的狀態
    • kube-controller-manager
      • 負責管理並運行 Kubernetes controller 的組件,簡單來說 controller 就是 Kubernetes 裡一個個負責監視 Cluster 狀態的 Process,例如:Node Controller、Replication Controller
      • 這些 Process 會在 Cluster 與預期狀態(desire state)不符時嘗試更新現有狀態(current state)
        • 例如:現在要多開一台機器以應付突然增加的流量,那我的預期狀態就會更新成 N+1,現有狀態為 N,這時相對應的 controller 就會想辦法多開一台機器
      • controller-manager 的監視與嘗試更新也都需要透過訪問 kube-apiserver 達成
    • kube-scheduler
      • 整個 Kubernetes 的 Pods 調度員,scheduler 會監視新建立但還沒有被指定要跑在哪個 Node 上的 Pod,並根據每個 Node 上面資源規定、硬體限制等條件去協調出一個最適合放置的 Node 讓該 Pod 跑

        Cluster

  • Kubernetes 中多個 Node 與 Master 的集合。基本上可以想成在同一個環境裡所有 Node 集合在一起的單位。

Kubernetes 進階三元件

Service

  • 在連線到一個 Pod 的服務資源時,會使用到 port-forward 的指令
  • 但如果我們有多個 Pods 想要同時被連線時,我們就可以用到 Service 這個進階元件
    • 簡單來說,Service 就是 Kubernetes 中用來定義「一群 Pod 要如何被連線及存取」的元件。

Deployment

  • 要把一個 Pod 做橫向擴展,也就是複製多個相同的 Pod 在 Cluster 中同時提供服務,並監控如果有 Pod 當機我們就要重新把它啟動時,如果我們要一個 Pod 一個 Pod 透過指令建立並監控是很花時間的。因此,我們可以透過 Deployment 這個特殊元件幫我們達成上述的要求。

Ingress

  • 了解完了 Service 跟 Deployment 後,接下來就輪到概念稍微複雜的 Ingress 元件了。 在上面有提到 Service 就是 Kubernetes 中用來定義「一群 Pod 要如何被連線及存取」的元件。 但在 Service 中,我們是將每個 Service 元件對外的 port number 跟 Node 上的 port number 做 mapping,這樣在我們的 Service 變多時,port number 以及分流規則的管理變得相當困難。
  • 而 Ingress 可以透過 HTTP/HTTPS,在我們眾多的 Service 前搭建一個 reverse-proxy。這樣 Ingress 可以幫助我們統一一個對外的 port number,並且根據 hostname 或是 pathname 決定封包要轉發到哪個 Service 上,如同下圖的比較:
  • 在 Kubernetes 中,Ingress 這項服務其實是由 Ingress Resources、Ingress Server、Ingress Controller 構成
    • Ingress Resources 就是定義 Ingress 的身分證
    • Ingress Server 則是實體化用來接收 HTTP/HTTPS 連線的網路伺服器
      • Ingress Server 有各式各樣的實作,就如同市面上的 Web Server 琳瑯滿目一樣
    • Ingress Controller 就是一個可以把定義好的 Ingress Resources 設定轉換成特定 Ingress Server 實作的角色。
    • 舉例來說,Kubernetes 由官方維護的兩種 Ingress Controller 就有 ingress-gceingress-nginx,分別可以對應轉換成 GCE 與 Nginx。也有其他非官方在維護的 Controller,詳細的列表可見官網的 additional-controllers

Reference

pyro

intro

  • Python Remote Object
  • Pyro庫的主要作用是讓我們的應用可以在network下相互通信,是個輕量級的庫
  • 實現了類似Java 的遠程方法調用(Remote Method Invocation, RMI). 可以調用一個遠程對象(存在於另一個進程中,甚至是另一台機器上)

    usage

  • 一旦客戶端連接,Pyro將創建類的一個實例,並在一個客戶端代理會話期間使用該單個對象來處理遠程方法調用。一旦客戶端斷開連接,對象就會被移除。另一個客戶端連接為其會話創建另一個實例。
  • e.g.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import Pyro4

    @Pyro4.expose
    class MyPyroThing(object):
    # ... methods that can be called go here...
    pass

    '''1创建守护进程'''
    daemon = Pyro4.Daemon()

    '''2注册uri'''
    uri = daemon.register(MyPyroThing)
    print(uri)

    '''3.启动守护进程'''
    daemon.requestLoop()

Reference

iptables

    • 基本上, iptables接到封包後, 會經由三個以上的主要規則表(tables)來處理:
      • (1)Mangle: 即圖中的M, 通常都不使用這個規則表了.
      • (2)NAT: 即圖中的N,
      • (3)Filter: 即圖中的F.
      • 當然還有一個Raw規則表, 也是少用.

四表五鏈

  • 我們加規則,加到每個鏈中,每個鏈中的規則有很多,有一部分規則是相似的,根據這些規則的型別,把相似的規則放在一起,這些放在一起的規則的集合稱為表。
    • filter表:負責過濾功能;
    • nat表:network address translation,網路地址轉換功能;
    • mangle表:拆解、修改、並重新封裝報文;
    • raw表:關閉nat表上啟用的連線追蹤機制;
  • 因為每個鏈中都有不同規則,所以表存在於每一個鏈中,但不是每個鏈都有這4種表
    • PREROUTING 的規則可以存在於:raw表,mangle表,nat表。
    • INPUT 的規則可以存在於:mangle表,filter表,nat表(centos7中有nat表,centos6中沒有)。
    • FORWARD 的規則可以存在於:mangle表,filter表。
    • OUTPUT 的規則可以存在於:raw表mangle表,nat表,filter表。
    • POSTROUTING 的規則可以存在於:mangle表,nat表。
  • 表的處理優先順序如下:
    • raw --> mangle --> nat --> filter
  • 只要遇到一個匹配的規則就按照這個規則進行處理,後面的規則對這個資料就不再起作用。
    • 拒絕可以使用DROP,也可以使用REJECT關鍵字
    • DROP不會給客戶端返回任何資訊,所以客戶端看到的情況就是連線超時,很難判斷是防火牆原因還是網路裝置故障等原因。
    • REJECT則明確返回給客戶端一個拒絕的資訊,客戶端會知道我是被防火牆拒絕了。
    • 可根據場景使用,REJECT更適合除錯,DROP抗攻擊上面更安全些。

reference

QoS

  • 封包的 QoS(Quality of Service) 表示該封包的品質,品質越好,表示有越低的延遲、掉包、…,作法是利用封包 header 的特定欄位值,來表示此封包 的優先等級。
  • 此欄位定義在 網路架構 第三層(Internet Protocol) header 的欄位中,長度為 8 bits,在 IPv4 和 IPv6 的 header 中的位置不同。
    • 在 IPv4 Header 此欄位稱為: DSCP / ToS
    • 在 IPv6 Header 此欄位稱為: Traffic Class

      intro

  • 在網路實行 QoS 一般分為 Integrated Services (IntServ) 和 Differentiated Services (DiffServ) 兩大方向

    IntServ

  • IntServ 的 QoS 實施方法是預先在訊息即將通過的每一隻 Router 預留網絡資源 (主要是 Bandwidth),讓訊息封包通過時保證有足夠資源去提供服務。
    • 用道路來作比喻,有一輛消防車趕著去救火,如若遇到交通擠塞便不能提供服務了,IntServ 就好比在每一個路段都把其中一條行車線劃為緊急車輛通道,只有像消防車這類緊急車輛可以使用。
    • 缺點是就算沒有緊急車輛通過,所有道路使用者也不可使用這條預留路線。

      DiffServ

  • DiffServ 則不預先設置緊急通道,當道路暢通時,所有車輛可自由使用任何路線。當某路段發生壅塞 (Congestion) 時,該路段才會實施交通管制,包括把道路分為緊急線、快線和慢線等,然後把車輛分門別類,按其緊急性去使用不同的路線
    • 例如緊急車輛使用緊急線,私人車用快線,公共交通工具使用慢線。甚至會在路線上選擇一些車輛炸掉 😨 (Packet Drop) 來舒緩 Congestion,通當是慢線車輛遭殃。
  • DiffServ 巧妙的地方在於每段道路可設立自己的交通管制方法,路段間互不影響,稱為 Per-hop Behavior (PHB)。而且交通管制措施只會在發生 Congestion 時才會實行,不像 IntServ 需長期預留路線。DiffServ 缺點在於設定比較複雜。

ToS (Type of Service)

  • ToS (Type of Service),細分成 Precedence 及 ToS 欄位
    • | Precedence(3) | ToS(4) | Unused(1) |
    • Precedence (RFC-1112) – 值越高,優先權越高
      1
      2
      3
      4
      5
      6
      7
      8
      | 111 | Network Control |
      | 110 | Internetwork Control |
      | 101 | Critic/ECP |
      | 100 | Flash Override |
      | 011 | Flash |
      | 010 | Immediate |
      | 001 | Priority |
      | 000 | Routine |
    • ToS (RFC-1349) – 值越大,優先權越高。這些值的組合是沒有意義的,分別獨立。
      1
      2
      3
      4
      5
      | 1000 | Minimize Delay |
      | 0100 | Maximize Throughput |
      | 0010 | Maximize Reliability |
      | 0001 | Minimize Monetary Cost |
      | 0000 | Normal Service(Default) |
      :::warning
    • Type of Service 最早定義在 RFC-791。之後的 RFC-2474 則改變了這些區域的代表意義,稱作 DS (Differentiated Services)。
    • ToS 因為定義問題,使得支援性比較低,實際網路上都是用 DS,因此在 IPv6 階段,ToS 已經不支援了。
      :::

      DSCP (Differentiated Service Code Point)

  • RFC-2474,分成 Class Selector、Drop Precedence 及 Explicit Congestion Notification (ECN)欄位
  • Class selector values (3)
DSCP Binary Hex Decimal Typical application Examples
CS0 (Default) 000 0x00 0
CS1 001 0x08 8 Scavenger YouTube, Gaming, P2P
CS2 010 0x10 16 OAM SNMP, SSH, Syslog
CS3 011 0x18 24 Signaling SCCP, SIP, H.323
CS4 100 0x20 32 Realtime TelePresence
CS5 101 0x28 40 Broadcast video Cisco IPVS
CS6 110 0x30 48 Network control EIGRP, OSPF, HSRP, IKE
CS7 111 0x38 56
  • Drop Precedence value (3)

    Drop Precedence Binary Hex Decimal
    Undefined 000 0x00 0
    Low 010 0x02 2
    Medium 100 0x04 4
    Heigh 110 0x06 6
    :::danger
  • The EF marking of 46 does NOT follow the drop preference rules of the assured forwarding model. Please do NOT think that the 11 means high drop preference.
    :::

ntp

1
2
3
4
5
6
7
8
9
10
11
12
From tests that were performed, indications are that precise time
distribution requires a very low packet delay variation (jitter)
transport. Therefore, we suggest that the following guidelines for
Network Time Protocol (NTP) be used:

o When NTP is used for providing high-accuracy timing within an
administrator's (carrier's) network or to end users/clients, the
Telephony service class should be used, and NTP packets should be
marked with EF DSCP value.
o For applications that require "wall clock" timing accuracy, the
Standard service class should be used, and packets should be
marked with DF DSCP.
  • wall clock time
    • Wall-clock time is the time that a clock on the wall (or a stopwatch in hand) would measure as having elapsed between the start of the process and ‘now’.
    • The user-cpu time and system-cpu time are pretty much as you said - the amount of time spent in user code and the amount of time spent in kernel code.
    • The units are seconds (and subseconds, which might be microseconds or nanoseconds).
    • The wall-clock time is not the number of seconds that the process has spent on the CPU; it is the elapsed time, including time spent waiting for its turn on the CPU (while other processes get to run).

Reference

c++ cast and conversion

conversion

Implicit conversion

  • 編譯器會嘗試以妥善定義的順序進行轉換,直到其中一個成功為止
  • Standard conversions affect fundamental data types, and allow the conversions between numerical types (short to int, int to float, double to int…), to or from bool, and some pointer conversions.
    閱讀全文 »

const char

introduction

  • Read the pointer declarations right-to-left.
  • const 放在 type 前或後是相同的
    • const char * const * is the same as char const * const *: a (non-const) pointer to a const pointer to a const char.
    • const char * is the same as char const *: a (non-const) pointer to a const char.
    • const char * * is the same as char const * *: a (non-const) pointer to a (non-const) pointer to a const char.
      閱讀全文 »

c string copy

strdup

  • #include <string.h>
  • char *strdup(const char *s1);
閱讀全文 »

Natural Order

  • it is also called version sorting
閱讀全文 »