まず、展開の前提
2は、CAとプライベート
デプロイメントkubectl
4展開はetcd
V.展開フランネルを
まず、前提としての展開
バイナリインストールの次のいくつかの着実な焦点は、バージョン1.14.3をkubernetes
1、バージョン情報
docker:v17.06.0-ce
etcd:v3.2.26
flannel:v0.11.0
Kubernetes:v1.14.3
OS:v7.3.1611
cfssl:v1.2.0
2、ホスト・プランニング
[root@master1 work]# vim /etc/hosts
192.168.192.222 master1 etcd www.mt.com
192.168.192.223 master2 etcd www.mt.com
192.168.192.224 master3 etcd www.mt.com
192.168.192.225 node1
192.168.192.226 node2
192.168.192.234 registry
注:MASTER1、MASTER2、master3 etcdもの展開に対処
ホスト名を使用する必要があります。各ホスト#の個々の設定は、ここで説明されていないためhostnamectlのSETPホスト名を手動で設定する
場合[root @のMASTER1作業]#ansibleすべて-i /ルート/ UDP "SRC =の/ etc -a /ホスト /ホストDEST =の/ etc / hosts"
3、ansible的ホスト
[root@master1 work]# cat /root/udp/hosts.ini
[master]
192.168.192.222 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.223 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.224 ansible_ssh_user=root ansible_ssh_pass=自己的密码
[master1]
192.168.192.222 ansible_ssh_user=root ansible_ssh_pass=自己的密码
[master2]
192.168.192.222 ansible_ssh_user=root ansible_ssh_pass=自己的密码
[master3]
192.168.192.222 ansible_ssh_user=root ansible_ssh_pass=自己的密码
[node]
192.168.192.225 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.226 ansible_ssh_user=root ansible_ssh_pass=自己的密码
[all]
192.168.192.222 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.223 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.224 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.225 ansible_ssh_user=root ansible_ssh_pass=自己的密码
192.168.192.226 ansible_ssh_user=root ansible_ssh_pass=自己的密码
4、初期化スクリプトinit.sh
[root@master1 work]# vim init.sh
#!/bin/bash
echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
systemctl disable firewalld && systemctl stop firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
modprobe ip_vs_rr
modprobe br_netfilter
[root@master1 work]# ansible all -i /root/udp/hosts -m copy "src=./init.sh dest=/opt/k8s/bin/init.sh"
[root@master1 work]# ansible all -i /root/udp/hosts -a "sh /opt/k8s/bin/init.sh"
我々は、すべてのクラスタ同期内のマシンとntpqの-np通常、安定したクロック源を必要とします
5、カーネルの最適化
[root@master1 work]# vim /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=655360000
fs.nr_open=655360000
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
[root@master1 work]# ansible all -i /root/udp/hosts.ini -m copy -a "src=/etc/sysctl.d/kubernetes.conf dest=/etc/sysctl.d/kubernetes.conf"
[root@master1 work]# ansible all -i /root/udp/hosts.ini -a "sysctl -p /etc/sysctl.d/kubernetes.conf"
6、コンフィギュレーション計画情報
- クラスタノードアドレス:192.168.192.222 192.168.192.223 192.168.192.224 192.168.192.225 192.168.192.226
- レジストリアドレス:192.168.192.234
- ホスト名:MASTER1 MASTER2 master3ノード1ノード2#IPアドレスと対応するクラスタノード
- ETCD住所:https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379
- ノード間通信ポートETCD:マスタ1 = https://192.168.192.222:2380,master2=https://192.168.192.223:2380,master3=https://192.168.192.224:2380
- APIServer住所:https://127.0.0.1:8443
- ネットワークインタフェースを使用します。eth0の
- ETCDデータディレクトリ:/データ/ K8S / etcd /データ
- ETCD WALディレクトリ:/データ/ K8S / etcd / WAL
- サービス・セグメント:10.244.0.0/16#が直接サービス利用のためのネットワークセグメントにアクセスすることはできません
- 使用nodePortモードのポートサービス:30000から32767
- DNSクラスタサービスのIP:10.244.0.2#
- ポッドセグメント:172.30.0.0/16
- DNSドメイン:cluster.local
- kubernetesサービスIP:10.244.0.1
- バイナリ格納ディレクトリ:/ OPT / K8S / binに
- MASTER1ノード操作上のすべての操作は、その後、他のノードに配布します
- 証明書の内容については/ opt / K8S /仕事/ CERT#
- /オプション/ K8S /仕事/ YAML位YMLコンテンツです
- 仕事へのサービスのための/ opt / K8S /仕事/サービス#
二、CAおよび秘密鍵
CFSSL CloudFlareのは、オープンソースPKI / TLSツールです。CFSSLは、署名の検証とバンドルTLS証明書のためのコマンドラインツールとHTTP APIサービスが含まれています。囲碁の言語を使用してください。
ダウンロード:https://pkg.cfssl.org/
クラスタ証明書:
- クライアント証明書:クライアント// kubeletを認証するサービスのためにのみクライアント証明書を必要とします
- サーバ証明書:サーバー、クライアントはサーバーの身元を確認するために使用されます
- ピア証明書:etcd証明//クラスタメンバー間の双方向通信
証明書の符号化形式:- PEM(プライバシー強化メール)、一般的に使用された認証局ASCIIファイルでBase64エンコード.KEY(証明機関、CA)、延長の.pem、.CRT、.CER、
- 内容:----- ----- -----証明書をBEGIN "と" ----- END CERTIFICATEの
- DER(識別符号化規則)、バイナリ形式。拡張子.DER
- CSR:証明書署名要求
1、インストールcfssl
ダウンロード:https://github.com/cloudflare/cfssl
#mv cfssl_linux-amd64 /opt/k8s/bin/cfssl
#mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson
#mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo
2、コマンド
cfssl:
- バンドル:クライアント証明書が含まれている証明書パッケージを作成します。
- でgenkey:キー(秘密鍵)とCSR(証明書署名要求)を生成します
- スキャン:スキャンホストの問題を
- 取り消し:証明書を失効
- certinfoを:出力と同じ効果cfssl-certinfoをツールで、証明書の証明書情報与えられました
- gencrl:新しい証明書失効リストを生成
- selfsign:新しい署名鍵と自己署名証明書を生成します
- 印刷デフォルト:デフォルトの設定を印刷し、デフォルトの設定では、テンプレートとして使用することができます
- サーブ:HTTP APIサービスを開始
- 情報:リモート署名者についての情報取得
- 記号:CAおよびCAのキーによって与えられたクライアント証明書、およびホスト名を締結
- gencertを:新しいキー(鍵)を生成し、証明書に署名しました
- -ca:証明書は、CAを示します
- 秘密鍵ファイルは、CAを指定します。-caキー
- -config:JSONは要求を示す証明書を提出
- -profile:-configおよびプロファイルは、プロファイルセクションの設定に応じて証明書を生成するための手段関連情報に対応します
次を理解することができます興味があるのは:https://github.com/cloudflare/cfssl
3、証明書の生成戦略を作成します
[root@master1 work]# cd /opt/k8s/work/
[root@master1 work]# vim ca-config.json
{
"signing": {
"default": {
"expiry": "26280h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "26280h"
}
}
}
}
戦略の説明:
CA-config.json:プロフィールシーン用いて、複数の定義異なる有効期限を指定し、他のパラメータができる
署名:CAにTRUE証明書生成ca.pem =、証明書は他の証明書に署名するために使用することができることを示し、
サーバー認証: ;これは、サーバが提供する証明書で確認することができ、クライアント証明書を表し
、クライアントが提供する証明書を検証することができるサーバ証明書を表し;:AUTHクライアント
4、CSRを作成します
[root@master1 work]# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "HangZhou",
"O": "k8s",
"OU": "FirstOne"
}
],
"ca": {
"expiry": "26280h"
}
}
[マスタ1 CERT @ルート]#
(CN)一般名:ユーザ名(ユーザ名)要求として証明書からKUBE-apiserver抽出されたフィールドは、ブラウザは、サイトが正当であることを確認するために、このフィールドを使用して;
O:から組織、KUBE-apiserver RBACは、ユーザ識別子を承認としてKUBE-apiserver抽出されたユーザ、グループ;証明書を要求しているユーザのグループ(グループ)としてフィールドを抽出
C = <国>国
ST = <状態>状態、州、
Lが= <都市>街の
O = <組織>組織名/会社名
OU = <組織単位>組織単位/企業部門
5、CAを生成します
[root@master1 work]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
[root@master1 work]# ls ca*
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem //生成 ca-key.pem(私钥),ca.pem(公钥),ca.csr(签署请求)
[root@master1 work]# ansible all -i /root/udp/hosts.ini -a "mkdir /etc/kubernetes/cert -pv "
[root@master1 work]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./ca.pem dest=/etc/kubernetes/cert/"
[root@master1 work]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./ca-key.pem dest=/etc/kubernetes/cert/"
[root@master1 cert]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./ca-config.json dest=/etc/kubernetes/cert"
[root@master1 cert]# cfssl certinfo -cert ca.pem //查看证书内容
[root@master1 cert]# cfssl certinfo -csr ca.csr //查看证书请求内容
第三に、展開kubectl
1、バイナリをコピーします
[root@master1 work]# ansible all -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kubelet dest=/opt/k8s/bin/'
[root@master1 work]# ansible all -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kube-proxy dest=/opt/k8s/bin/'
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a "src=/opt/k8s/bin/cloud-controller-manager dest=/opt/k8s/bin"
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a "src=/opt/k8s/bin/apiextensions-apiserver dest=/opt/k8s/bin"
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kube-apiserver dest=/opt/k8s/bin/'
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kube-scheduler dest=/opt/k8s/bin/'
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kube-controller-manager dest=/opt/k8s/bin/'
[root@master1 work]# ansible master -i /root/udp/hosts.ini -m copy -a 'src=/opt/k8s/bin/kubectl dest=/opt/k8s/bin/'
2. CSRのadiminを作成します。
kubectlのデフォルトは〜/ .kube / configファイルからKUBE-apiserverアドレスと認証情報を読み取る
証明書署名要求を作成するには:
[root@master1 cert]# vim admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "HangZhou",
"O": "system:masters",
"OU": "FirstOne"
}
]
}
[マスタ1 @ルートCERT]#の
O:値システム:KUBE-apiserverグループは、システムの要求の後に設定された証明書受信マスター:マスターを、
あらかじめ定義されたClusterRoleBindingクラスタ管理者グループシステム:マスターと結ば役割クラスタ管理者;すべてのAPIへのロールの付与権限を与えられ
た証明書のみを使用するようkubectlクライアント証明書になりますので、ホストフィールドが空です。
3、証明書と秘密鍵を生成します
[root@master1 cert]# cfssl gencert -ca=./ca.pem -ca-key=./ca-key.pem -config=./ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
生成:admin.csr管理者-key.pem admin.pem
図4に示すように、文書生成kubeconfig
情報apiserverとCA証明書の含まれている設定ファイルkubectlするkubeconfig
デフォルトビュー:
[root@master1 cert]# kubectl config view
apiVersion: v1
clusters: [] #配置要访问的kubernetes集群
contexts: [] #配置访问kubernetes集群的具体上下文环境
current-context: "" #配置当前使用的上下文环境
kind: Config
preferences: {}
users: [] # 配置访问的用户信息,用户名以及证书信息
# 设置集群参数 //把ca.pem和server的内容添加到kubectl.config 文件cluster中
kubectl config set-cluster kubernetes --certificate-authority=./ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=kubectl.kubeconfig
# 设置客户端认证参数 //把admin账户的公钥和私钥添加到kubectl.config 文件users中
[root@master1 cert]# kubectl config set-credentials admin --client-certificate=./admin.pem --client-key=./admin-key.pem --embed-certs=true --kubeconfig=kubectl.kubeconfig
# 设置上下文参数 //把context内容添加到 kubectl.config 文件中
kubectl config set-context kubernetes --cluster=kubernetes --user=admin --kubeconfig=kubectl.kubeconfig
# 设置默认上下文
kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfig
パラメータ: -埋め込む-本命=真の表現にネストkubectl.kubeconfigコンテンツファイルが
追加されていない、証明書ファイルがパスに書き込まれ、その後のコピーkubeconfig他のマシンに、だけでなく、単独の証明書ファイルをコピーする必要があります
5、配布kubectl.config
すべてのマスターノードにファイルを配布Kubectl.config
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m shell -a " mkdir ~/kube"
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m copy -a "src=./kubectl.kubeconfig dest=~/.kube/config"
第四に、展開etcd
サービスの発見、構成、および共有の同時実行制御(例えば、リーダー選挙、分散ロック)のためEtcd。kubernetesはetcd格納し、すべての動作データを使用します
1.配布プロフィール
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m copy -a "src=./etcdctl dest=/opt/k8s/bin"
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m copy -a "src=./etcd dest=/opt/k8s/bin"
2、etcdのための証明書を作成
[root@master1 cert]# vim etcd-csr.json
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"192.168.192.222",
"192.168.192.223",
"192.168.192.224"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "HangZhou",
"O": "k8s",
"OU": "FirstOne"
}
]
}
[root@master1 cert]# cfssl gencert -ca=./ca.pem -ca-key=./ca-key.pem -config=./ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
[root@master1 cert]# ls etcd*
etcd.csr etcd-csr.json etcd-key.pem etcd.pem
3、証明書と秘密キーを配布
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m copy -a "src=./etcd.pem dest=/etc/etcd/cert/"
[root@master1 cert]# ansible master -i /root/udp/hosts.ini -m copy -a "src=./etcd-key.pem dest=/etc/etcd/cert/"
4、構成サービス
[root@master1 service]# vim etcd.service.template
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/data/k8s/etcd/data
ExecStart=/opt/k8s/bin/etcd \
--data-dir=/data/k8s/etcd/data \
--wal-dir=/data/k8s/etcd/wal \
--name=NODE_NAME \
--cert-file=/etc/etcd/cert/etcd.pem \
--key-file=/etc/etcd/cert/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/cert/ca.pem \
--peer-cert-file=/etc/etcd/cert/etcd.pem \
--peer-key-file=/etc/etcd/cert/etcd-key.pem \
--peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--listen-peer-urls=https://NODE_IP:2380 \
--initial-advertise-peer-urls=https://NODE_IP:2380 \
--listen-client-urls=https://NODE_IP:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://NODE_IP:2379 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=master1=https://192.168.192.222:2380,master2=https://192.168.192.223:2380,master3=https://192.168.192.224:2380 \
--initial-cluster-state=new \
--auto-compaction-retention=1 \
--max-request-bytes=33554432 \
--quota-backend-bytes=6442450944 \
--heartbeat-interval=250 \
--election-timeout=2000
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@master1 service]# sed 's/NODE_NAME/master1/g;s/NODE_IP/192.168.192.222/g;s/\\//' etcd.service &> ./etcd.service.master1
[root@master1 service]# sed 's/NODE_NAME/master2/g;s/NODE_IP/192.168.192.223/g' etcd.service &> ./etcd.service.master2
[root@master1 service]# sed 's/NODE_NAME/master3/g;s/NODE_IP/192.168.192.224/g' etcd.service &> ./etcd.service.master3
[root@master1 service]# ansible master -i /root/udp/hosts.ini -a "mkdir -pv /data/k8s/etcd/data"
[root@master1 service]# ansible master -i /root/udp/hosts.ini -a "mkdir -pv /data/k8s/etcd/wal"
[root@master1 service]# scp etcd.service.master1 root@master1:/etc/systemd/system/etcd.service
[root@master1 service]# scp etcd.service.master2 root@master2:/etc/systemd/system/etcd.service
[root@master1 service]# scp etcd.service.master3 root@master3:/etc/systemd/system/etcd.service
5、パラメータ説明
name=NODE_NAME #节点名称
cert-file=/etc/etcd/cert/etcd.pem #etcd的公钥
key-file=/etc/etcd/cert/etcd-key.pem #etcd的私钥
trusted-ca-file=/etc/kubernetes/cert/ca.pem #ca的私钥
peer-cert-file=/etc/etcd/cert/etcd.pem #
peer-key-file=/etc/etcd/cert/etcd-key.pem #etcd集群内部成员的ca私钥
peer-trusted-ca-file=/etc/kubernetes/cert/ca.pem #信任的证书
peer-client-cert-auth #
client-cert-auth #
listen-peer-urls=https://NODE_IP:2380 #监听用于节点通信的url
initial-advertise-peer-urls=https://NODE_IP:2380 #监听的用于客户端通信的url
listen-client-urls=https://NODE_IP:2379,http://127.0.0.1:2379 #建议用于监听客户端通信的url
advertise-client-urls=https://NODE_IP:2379 #
initial-cluster-token=etcd-cluster-0 #节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
initial-cluster=master1 #
initial-cluster-state=new #新建集群的标志
auto-compaction-retention=1 # MVCC密钥值存储的自动压缩保留时间(小时)。0表示禁用自动压缩。
max-request-bytes=33554432 #
quota-backend-bytes=6442450944 #
heartbeat-interval=250 #心跳检测
election-timeout=2000 #选举超时时间
6、サービスを開始
[root@master1 service]# ansible master -i /root/udp/hosts.ini -m shell -a "chmod +x /opt/k8s/bin/* "
[root@master1 service]# ansible master -i /root/udp/hosts.ini -a "systemctl start etcd.service"
[root@master1 service]# ansible master -i /root/udp/hosts.ini -m shell -a "systemctl daemon-reload;systemctl restart etcd.service"
[root@master1 service]# ansible master -i /root/udp/hosts.ini -m shell -a "systemctl enable etcd.service"
7、etcdサービス検証
[root@master1 service]# ETCDCTL_API=3 /opt/k8s/bin/etcdctl -w table --cacert=/etc/kubernetes/cert/ca.pem --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 endpoint status
+------------------------------+------------------+---------+---------+-----------+-----------+------------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+------------------------------+------------------+---------+---------+-----------+-----------+------------+
| https://192.168.192.222:2379 | 2c7d8b7aa58766f3 | 3.2.26 | 25 kB | true | 29 | 15 |
| https://192.168.192.223:2379 | 257fa42984b72360 | 3.2.26 | 25 kB | false | 29 | 15 |
| https://192.168.192.224:2379 | 3410f89131d2eef | 3.2.26 | 25 kB | false | 29 | 15 |
+------------------------------+------------------+---------+---------+-----------+-----------+------------+
[root@master1 cert]# etcdctl --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 --ca-file=/opt/k8s/work/cert/ca.pem --cert-file=/opt/k8s/work/cert/flanneld.pem --key-file=/opt/k8s/work/cert/flanneld-key.pem member list
3410f89131d2eef: name=master3 peerURLs=https://192.168.192.224:2380 clientURLs=https://192.168.192.224:2379 isLeader=false
257fa42984b72360: name=master2 peerURLs=https://192.168.192.223:2380 clientURLs=https://192.168.192.223:2379 isLeader=false
2c7d8b7aa58766f3: name=master1 peerURLs=https://192.168.192.222:2380 clientURLs=https://192.168.192.222:2379 isLeader=true
フランネルの展開、フィフス
1は、バイナリファイルを発行しました
[root@master1 service]# ansible all -i /root/udp/hosts.ini -m copy -a "src=../../bin/flanneld dest=/opt/k8s/bin"
[root@master1 service]# ansible all -i /root/udp/hosts.ini -m copy -a "src=/root/k8s/mk-docker-opts.sh dest=/opt/k8s/bin/"
[root@master1 service]# ansible all -i /root/udp/hosts.ini -m shell -a "chmod +x /opt/k8s/bin/*"
2、証明書と秘密鍵を作成します
[root@master1 cert]# vim flanneld-csr.json
{
"CN": "flanneld",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "HangZhou",
"O": "k8s",
"OU": "FirstOne"
}
]
}
[root@master1 cert]# cfssl gencert -ca=./ca.pem -ca-key=./ca-key.pem -config=./ca-config.json -profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
[root@master1 cert]# ansible all -i /root/udp/hosts.ini -m shell -a "mkdir /etc/flanneld/cert"
[root@master1 cert]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./flanneld.pem dest=/etc/flanneld/cert"
[root@master1 cert]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./flanneld-key.pem dest=/etc/flanneld/cert/"
図3に示すように、ポッドセグメント情報を書き込みます
[root@master1 cert]# etcdctl --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 --ca-file=/opt/k8s/work/cert/ca.pem --cert-file=/opt/k8s/work/cert/flanneld.pem --key-file=/opt/k8s/work/cert/flanneld-key.pem mk /kubernetes/network/config '{"Network":"'172.30.0.0/16'", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}'
{"Network":"172.30.0.0/16", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}
[root@master1 cert]# etcdctl --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 --ca-file=/opt/k8s/work/cert/ca.pem --cert-file=/opt/k8s/work/cert/flanneld.pem --key-file=/opt/k8s/work/cert/flanneld-key.pem get /kubernetes/network/config
{"Network":"172.30.0.0/16", "SubnetLen": 21, "Backend": {"Type": "vxlan"}}
4、サービスの構成
[root@master1 service]# vim flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
Before=docker.service
[Service]
Type=notify
ExecStart=/opt/k8s/bin/flanneld \
-etcd-cafile=/etc/kubernetes/cert/ca.pem \
-etcd-certfile=/etc/flanneld/cert/flanneld.pem \
-etcd-keyfile=/etc/flanneld/cert/flanneld-key.pem \
-etcd-endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 \
-etcd-prefix=/kubernetes/network \
-iface=eth0 \
-ip-masq
ExecStartPost=/opt/k8s/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=always
RestartSec=5
StartLimitInterval=0
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
[root@master1 service]# ansible all -i /root/udp/hosts.ini -m copy -a "src=./flanneld.service dest=/etc/systemd/system/"
[root@master1 ~]# ansible all -i /root/udp/hosts.ini -m shell -a "systemctl daemon-reload ;systemctl restart flanneld.service &&systemctl status flanneld.service"
[root@master1 ~]# ansible all -i /root/udp/hosts.ini -m shell -a "systemctl enable flanneld.service"
ポッドのサブネット情報の書き込み/実行/フランネル/ドッカファイルdocker0ブリッジ、環境変数を使用してこのファイル(DOCKER_NETWORK_OPTIONS)ドッカ以降の起動設定に割り当てられたmk-docker-opts.sh flanneldスクリプト、
IP-mqsq :flanneld SNATルールが外部ネットワークアクセスポッドドッカー変数--ip-マスカレード(/実行/フランネルに流れるように設定されている場合、合格 /ドッキングウィンドウのfalseに設定されたファイル)
のみ、ドッキングウィンドウにflanneldより緩やかな基準に作成SNATルール非ポッドネットワーク要求へのアクセスは、SNATを行います。
図5に示すように、ポッドセグメント情報を参照してください
[root@master1 cert]# etcdctl --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 --ca-file=/etc/kubernetes/cert/ca.pem --cert-file=/etc/flanneld/cert/flanneld.pem --key-file=/etc/flanneld/cert/flanneld-key.pem ls /kubernetes/network/subnets
/kubernetes/network/subnets/172.30.8.0-21
/kubernetes/network/subnets/172.30.96.0-21
/kubernetes/network/subnets/172.30.64.0-21
/kubernetes/network/subnets/172.30.32.0-21
/kubernetes/network/subnets/172.30.56.0-21
ポッドはIPインタフェースアドレスとフランネルを対応するネットワーク・ノードのアプリケーションノードを表示します。
[root@master1 cert]# etcdctl --endpoints=https://192.168.192.222:2379,https://192.168.192.223:2379,https://192.168.192.224:2379 --ca-file=/etc/kubernetes/cert/ca.pem --cert-file=/etc/flanneld/cert/flanneld.pem --key-file=/etc/flanneld/cert/flanneld-key.pem get /kubernetes/network/subnets/172.30.8.0-21
{"PublicIP":"192.168.192.223","BackendType":"vxlan","BackendData":{"VtepMAC":"f6:e1:42:b9:35:70"}}
PublicIP:192.168.192.223 //被分配的节点是192.168.192.223,这个节点的网段是172.30.8.0/21
VtepMAC:f6:e1:42:b9:35:70为192.168.192.223节点的flannel.1网卡 MAC 地址
[root@master1 service]# cat /run/flannel/docker
DOCKER_OPT_BIP="--bip=172.30.96.1/21"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.30.96.1/21 --ip-masq=false --mtu=1450"
[root@master1 service]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.30.0.0/16
FLANNEL_SUBNET=172.30.96.1/21
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
flanneldは、ネットワークに独自の情報を書き込み:/ RUN /フランネル/ドッカー
すべてのIPを分配するための現在のノードポッドコンテナのこのアドレスフィールドからなるように環境設定でドッカーその後の使用は、橋をdocker0ファイル。
参考サイト:
https://github.com/cloudflare/cfssl
https://kubernetes.io/docs/setup/
https://github.com/opsnull/follow-me-install-kubernetes-cluster/blob/master/ 04%E9の%83%A8%の E7%BD%B2etcd%E9%9B%86%E7%BE%A4.md