kubernetes apiserver認證

kubernetes認證

Kubernetes集羣的操作可以通過apiserver來進行操作,kubectl命令最終也是調用的apiserver,如果想要獲取對apiserver進行操作,需要先通過其認證

api-server的認證方式:

  • 基本認證:basic-auth

--basic-auth-file=/path/to/basic-auth.csv
在basic-auth.csv中擁有以列爲單位的認證信息,格式爲password,username,uid

示例:

passwd,kinderao,1
password2,test,2
然後在 kube-apiserver啓動的時候加上--basic-auth-file=/path/to/basic-auth.csv這個參數,啓動起來過後再在使用k8s的api就需要加上認證信息,否則就會unauthorized,加認證信息的方法是在http請求的header中添加一個Authorization,value是Basic base64編碼後的用戶名密碼信息
  • Token認證:token-auth

    --token-auth-file=/path/to/token-auth.csv

在token-auth.csv中擁有以列爲單位的認證信息,格式爲token,username,uid

示例

token,kinderao,1
token2,kinderao2,2
同樣也是在apiserver的啓動參數裏面加入--token-auth-file=/path/to/token-auth.csv這個參數,然後在請求的時候同樣在header中添加Authorization,value是Bearer token
  • CA證書認證:

    在使用證書認證之前首先需要申請證書,證書可以通過權威CA來申請,也可以通過自簽證書,不過部署kubernetes的大多數環境都是內網環境,所以更多的還是使用的是自簽證書。

生成證書的步驟如下:

  1. 首先需要你的linux系統上安裝有openssl,大多數的linux發行版都帶有這個工具,使用openssl生成根證書cacert:

    # 生成密鑰
    openssl genrsa -out ca.key 2048
    # 生成根證書
    openssl req -x509 -nodes -key ca.key -subj "/CN=yourcomany.com" -days 5000 -out ca.crt
  2. 爲server生成證書:

    # 生成server的密鑰
    openssl genrsa -out server.key 2048
    # 生成證書申請,其中的hostname需要填入你的服務器的域名或者ip地址,這個地方有個坑 # 就是在這填入的是什麼地址,在client請求的時候就要使用這個地址,之前配的是ip,但是請求的時候使用主機名,導致一直沒有出現bad certificate的問題
    openssl req -new -key server.key -subj "/CN=`hostname`" -out server.csr
    # 使用剛纔生成的根證書以及密鑰來生成server的證書
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
  3. 再爲client生成證書:

    # 生成client的密鑰
    openssl genrsa -out client.key 2048
    # 生成證書申請,這裏需要填的地址和上面的server一致即可
    openssl req -new -key client.key -subj "/CN=`hostname`" -out client.csr
    # 使用根證書和密鑰來生成client的證書
    openssl x509 -req -in client.csr -CA ca.crt -CAcreateserial -out client.crt -days 5000
  4. 配置api-server的啓動參數,在apiserver的啓動參數中加上下面的啓動參數

    --secure-port=443 --client_ca_file=/root/genkey/ca.crt 
    --tls-private-key-file=/root/genkey/server.key 
    --tls-cert-file=/root/genkey/server.crt

也可以放到/etc/kubernets/apiserver配置文件的args參數裏面
啓動kube-apiserver會看見一下日誌:

I0330 05:17:46.582385 4776 config.go:531] Will report 10.0.0.103 as public IP address.
[restful] 2017/03/30 05:17:46 log.go:30: [restful/swagger] listing is available at https://10.0.0.103:443/swaggerapi/
[restful] 2017/03/30 05:17:46 log.go:30: [restful/swagger] https://10.0.0.103:443/swaggerui/ is mapped to folder /swagger-ui/
I0330 05:17:46.950556 4776 serve.go:104] Serving securely on 0.0.0.0:443
I0330 05:17:46.950618 4776 serve.go:118] Serving insecurely on 127.0.0.1:8080

我們在本機上使用curl來驗證一下:

curl https://hostname:443 --cacert ca.crt --key client.key --cert client.crt

以後的請求都需要帶有根證書和client key和client的證書

本文轉自SegmentFault-kubernetes apiserver認證

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章