手動(dòng)構(gòu)筑單機(jī)版K8s(二)創(chuàng)建TLS證書(shū)和秘鑰

2.創(chuàng)建TLS證書(shū)和秘鑰

kubernetes 系統(tǒng)的各組件需要使用 TLS 證書(shū)對(duì)通信進(jìn)行加密纵势,本文檔使用 CloudFlare 的 PKI 工具集 cfssl 來(lái)生成 Certificate Authority (CA) 和其它證書(shū);

生成的 CA 證書(shū)和秘鑰文件如下:

  • ca-key.pem
  • ca.pem
  • kubernetes-key.pem
  • kubernetes.pem
  • kube-proxy.pem
  • kube-proxy-key.pem
  • admin.pem
  • admin-key.pem

使用證書(shū)的組件如下:

  • etcd:使用 ca.pem尼荆、kubernetes-key.pem找默、kubernetes.pem;
  • kube-apiserver:使用 ca.pem、kubernetes-key.pem艳吠、kubernetes.pem;
  • kubelet:使用 ca.pem孽椰;
  • kube-proxy:使用 ca.pem昭娩、kube-proxy-key.pem、kube-proxy.pem黍匾;
  • kubectl:使用 ca.pem栏渺、admin-key.pem、admin.pem锐涯;
  • kube-controller-manager:使用 ca-key.pem磕诊、ca.pem

安裝 CFSSL

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo

export PATH=/usr/local/bin:$PATH

創(chuàng)建 CA(Certificate Authority)

創(chuàng)建 CA 配置文件:

mkdir /root/ssl
cd /root/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
# 根據(jù)config.json文件的格式創(chuàng)建如下的ca-config.json文件
# 過(guò)期時(shí)間設(shè)置成了 87600h
touch ca-config.json
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF

字段說(shuō)明

  • ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間纹腌、使用場(chǎng)景等參數(shù)霎终;后續(xù)在簽名證書(shū)時(shí)使用某個(gè) profile;
  • signing:表示該證書(shū)可用于簽名其它證書(shū)升薯;生成的 ca.pem 證書(shū)中 CA=TRUE莱褒;
  • server auth:表示client可以用該 CA 對(duì)server提供的證書(shū)進(jìn)行驗(yàn)證;
  • client auth:表示server可以用該CA對(duì)client提供的證書(shū)進(jìn)行驗(yàn)證涎劈;

創(chuàng)建 CA 證書(shū)簽名請(qǐng)求:

創(chuàng)建 ca-csr.json 文件广凸,內(nèi)容如下:

{
  "CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ],
    "ca": {
       "expiry": "87600h"
    }
}
  • "CN":Common Name,kube-apiserver 從證書(shū)中提取該字段作為請(qǐng)求的用戶名 (User Name)蛛枚;瀏覽器使用該字段驗(yàn)證網(wǎng)站是否合法谅海;
  • "O":Organization,kube-apiserver 從證書(shū)中提取該字段作為請(qǐng)求用戶所屬的組 (Group)蹦浦;
  • "C":所在國(guó)家,"ST":所在省份,"L":所在城市

生成 CA 證書(shū)和私鑰

$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@k8s bin]#  ls ca*
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

創(chuàng)建 kubernetes證書(shū)

創(chuàng)建 kubernetes 證書(shū)簽名請(qǐng)求文件 kubernetes-csr.json

{
    "CN": "kubernetes",
    "hosts": [
      "127.0.0.1",
      "10.254.0.1",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "BeiJing",
            "L": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
  • "host":指定授權(quán)使用該證書(shū)的 IP 或域名列表扭吁,由于該證書(shū)后續(xù)被 etcd 集群和 kubernetes master 集群使用,所以上面分別指定了 etcd 集群盲镶、kubernetes master 集群的主機(jī) IP(本次etcd與master直接使用本機(jī)ip 127.0.0.1) 和 kubernetes 服務(wù)的服務(wù) IP(一般是 kube-apiserver 指定的 service-cluster-ip-range 網(wǎng)段的第一個(gè)IP侥袜,如 10.254.0.1)。

生成 kubernetes 證書(shū)和私鑰

$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
[root@k8s bin]#  ls kubernetes*
kubernetes.csr  kubernetes-csr.json  kubernetes-key.pem  kubernetes.pem

創(chuàng)建 admin證書(shū)

創(chuàng)建 admin 證書(shū)簽名請(qǐng)求文件 admin-csr.json

{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
  • O 指定該證書(shū)的 Groupsystem:masters徒河,kubelet 使用該證書(shū)訪問(wèn) kube-apiserver 時(shí) 系馆,由于證書(shū)被 CA 簽名,所以認(rèn)證通過(guò)顽照,同時(shí)由于證書(shū)用戶組為經(jīng)過(guò)預(yù)授權(quán)的 system:masters由蘑,所以被授予訪問(wèn)所有 API 的權(quán)限闽寡;

  • kube-apiserver 預(yù)定義了一些 RBAC 使用的 RoleBindings,如 cluster-adminGroup system:mastersRole cluster-admin 綁定尼酿,該 Role 授予了調(diào)用kube-apiserver 的所有 API的權(quán)限爷狈;

生成 admin 證書(shū)和私鑰

$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
[root@k8s bin]#  ls admin*
admin.csr  admin-csr.json  admin-key.pem  admin.pem

創(chuàng)建 kube-proxy證書(shū)

創(chuàng)建 kube-proxy 證書(shū)簽名請(qǐng)求文件 kube-proxy-csr.json

{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
  • CN 指定該證書(shū)的 User 為 system:kube-proxy

  • kube-apiserver 預(yù)定義的 RoleBinding system:node-proxier 將User system:kube-proxy 與 Role system:node-proxier 綁定裳擎,該 Role 授予了調(diào)用 kube-apiserver Proxy 相關(guān) API 的權(quán)限涎永;

生成 kube-proxy 證書(shū)和私鑰

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy
[root@k8s bin]#  ls kube-proxy*
kube-proxy.csr  kube-proxy-csr.json  kube-proxy-key.pem  kube-proxy.pem

校驗(yàn)證書(shū)

Kubernetes 證書(shū)為例。

使用 openssl 命令

$ openssl x509  -noout -text -in  kubernetes.pem
...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=Kubernetes
        Validity
            Not Before: Apr  5 05:36:00 2017 GMT
            Not After : Apr  5 05:36:00 2018 GMT
        Subject: C=CN, ST=BeiJing, L=BeiJing, O=k8s, OU=System, CN=kubernetes
...
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, TLS Web Client Authentication
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                DD:52:04:43:10:13:A9:29:24:17:3A:0E:D7:14:DB:36:F8:6C:E0:E0
            X509v3 Authority Key Identifier:
                keyid:44:04:3B:60:BD:69:78:14:68:AF:A0:41:13:F6:17:07:13:63:58:CD

            X509v3 Subject Alternative Name:
                DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster, DNS:kubernetes.default.svc.cluster.local, IP Address:127.0.0.1
...
  • 確認(rèn) Issuer 字段的內(nèi)容和 ca-csr.json 一致鹿响;
  • 確認(rèn) Subject 字段的內(nèi)容和 kubernetes-csr.json 一致羡微;
  • 確認(rèn) X509v3 Subject Alternative Name 字段的內(nèi)容和 kubernetes-csr.json 一致;
  • 確認(rèn) X509v3 Key Usage惶我、Extended Key Usage 字段的內(nèi)容和 ca-config.json 中 kubernetes profile 一致妈倔;

分發(fā)證書(shū)

將生成的證書(shū)和秘鑰文件(后綴名為.pem)拷貝到 /etc/kubernetes/ssl 目錄下備用;

mkdir -p /etc/kubernetes/ssl
cp *.pem /etc/kubernetes/ssl
[root@k8s bin]# ls /etc/kubernetes/ssl/
admin-key.pem  admin.pem  ca-key.pem  ca.pem  kube-proxy-key.pem  kube-proxy.pem  kubernetes-key.pem  kubernetes.pem

參考

安裝步驟

  1. 事前準(zhǔn)備
  2. 創(chuàng)建TLS證書(shū)和秘鑰
  3. 安裝kubectl命令行工具
  4. 創(chuàng)建kubeconfig文件
  5. 創(chuàng)建高可用etcd集群
  6. 部署master節(jié)點(diǎn)
  7. 部署node節(jié)點(diǎn)
  8. 全局驗(yàn)證
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绸贡,一起剝皮案震驚了整個(gè)濱河市盯蝴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌听怕,老刑警劉巖捧挺,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尿瞭,居然都是意外死亡闽烙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)筷厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸣峭,“玉大人,你說(shuō)我怎么就攤上這事酥艳。” “怎么了爬骤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵充石,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霞玄,道長(zhǎng)骤铃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任坷剧,我火速辦了婚禮惰爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惫企。我一直安慰自己撕瞧,他們只是感情好陵叽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著丛版,像睡著了一般巩掺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上页畦,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天胖替,我揣著相機(jī)與錄音,去河邊找鬼豫缨。 笑死独令,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的好芭。 我是一名探鬼主播燃箭,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栓撞!你這毒婦竟也來(lái)了遍膜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓤湘,失蹤者是張志新(化名)和其女友劉穎瓢颅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弛说,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挽懦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了木人。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信柿。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醒第,靈堂內(nèi)的尸體忽然破棺而出渔嚷,到底是詐尸還是另有隱情稠曼,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布司恳,位于F島的核電站耍共,受9級(jí)特大地震影響枫弟,放射性物質(zhì)發(fā)生泄漏淡诗。R本人自食惡果不足惜韩容,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一请梢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧够坐,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疫鹊。三九已至聋迎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工渐溶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荔茬。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像竹海,于是被迫代替她去往敵國(guó)和親慕蔚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容