kubernetes實踐之十八:叢集各模組之間的通訊

百聯達發表於2018-04-18
一: 通訊結構圖

二:kubernetes客戶端認證方式
Kubernetes提供管理三種級別的客戶端身份認證方式:
1.
最嚴格的HTTPS證書認證:基於CA根證書籤名的雙向數字證書認證方式;
2.
HTTP Token認證:通過一個Token來識別合法使用者;
3.
HTTP Base認證:通過使用者名稱+密碼的方式認證;

上圖中展示的是使用HTTPS證書認證的方式。
三:各模組之間的通訊方式
在開啟了 TLS 的叢集中,每當與叢集互動的時候少不了的是身份認證,使用 kubeconfig(即證書) 和 token 兩種認證方式是最簡單也最通用的認證方式。

1.kubectl跟API Server之間採用的是kubeconfig進行TLS的認證
2.kubelet跟API Server之間採用Token(bootstrap token)和Kubeconfig相結合的方式進行TLS的認證
3.Pod跟API Server之間採用的是Token(Service Account Token)的方式進行TLS的認證。
4.叢集外使用者通過kubectl proxy 方式提供http訪問(僅作測試用
5.scheduler,controller manager與API Server之間通過Http訪問(scheduler,controller manager,API Server要求部署在同一臺伺服器上
6.ETCD之間通過TLS進行通訊
7.API Server與ETCD之間通過TLS進行通訊
8.API SERVER與kube-proxy之間通過kubeconfig進行TL的認證

四:kubectl通訊設定

kubectl預設會從$HOME/.kube目錄下查詢檔名為 config 的檔案,也可以通過設定環境變數 KUBECONFIG 或者通過設定 --kubeconfig 去指定其它 kubeconfig 檔案。

點選(此處)摺疊或開啟

  1. export KUBE_APISERVER="https://masterIp:6443"
  2. # 設定叢集引數
  3. kubectl config set-cluster kubernetes \
  4. --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  5. --embed-certs=true \
  6. --server=${KUBE_APISERVER}
  7. # 設定客戶端認證引數
  8. kubectl config set-credentials admin \
  9. --client-certificate=/etc/kubernetes/ssl/admin.pem \
  10. --embed-certs=true \
  11. --client-key=/etc/kubernetes/ssl/admin-key.pem
  12. # 設定上下文引數
  13. kubectl config set-context kubernetes \
  14. --cluster=kubernetes \
  15. --user=admin
  16. # 設定預設上下文
  17. kubectl config use-context kubernetes
1.生成的 kubeconfig 被儲存到 ~/.kube/config 檔案;配置檔案描述了叢集、使用者和上下文
2.設定叢集引數:set-cluster設定了需要訪問的叢集,如上面的kubernetes,這只是個名稱,實際為--server指向的apiserver; --certificate-authority設定了該叢集的公鑰;--embed-certs為true表示將--certificate-authority證書寫入到kubeconfig中;--server則表示該叢集的kube-apiserver地址
3.設定客戶端認證引數:
set-credentials admin 設定使用者admin;--client-certificate設定客戶證書;--client-key設定客戶私鑰;--embed-certs為true表示將證書寫入kubeconfig中;admin.pem 證書 OU 欄位值為 system:masters , kube-apiserver預定義的 RoleBinding cluster-admin 將 Group system:masters與 Role cluster-admin 繫結,該 Role 授予了調? kube-apiserver相關 API 的許可權;
4.設定上下文引數:上下文名稱為kubenetes,叢集為kubenetes,使用者為admin,表示使用admin的使用者憑證來訪問kubenetes叢集的default名稱空間,也可以增加--namspace來指定訪問的名稱空間。叢集引數和使用者引數可以同時設定多對;
5.kubectl config use-context kubernetes來使用名為kubenetes的環境項來作為配置。如果配置了多個環境項,可以通過切換不同的環境項名字來訪問到不同的叢集環境。

最終生成的config檔案內容如下:

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. clusters:
  3. - cluster:
  4.     certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVSVprZlNwNSs5REY3OUZEYXFhQ1haYXRsOG9Rd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU0TURNeE1qQTFNall3TUZvWERUSXpNRE14TVRBMU1qWXdNRm93WlRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByZFdKbGNtNWxkR1Z6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcERaU3NjQWF2N3Roa0JDUTZYN2cKWGZCZ3JOZWM2amc1YjdzVXEzSENyc1hYL3dlOW5POVNxVmxGdS8vY3VMTXNiWEhTdGhXYzJtTXBhdzlmQWVUdwpqK2gyOVZjTkJEamhWbzNhbUFZNk9pR1hOWWZQd0hsaHN4bVFXT0Zrc1NybnpOaGk4djc5K0R5bk1Bc3BSVHlxCk5KODdSUi93d0x6TDVUcFlka1U2U3dIK1ZsR01NRjNEMFdRSjV1ZHlNbFBiRnQyWVVnZE1VRXVCdDRVYWp3d2cKZE9jSVdEcFV0Q0pGNXUvU3RTaHA3RDdRb05rUDdKa2dodm5KMEx6enZxZnlkVFE2MW1HSXIvUHpYS0d3VkJoTgpEQ0hCMTJ1SDBEUkxwK3V2UE5pdmRYcS9wSzE0dWlxYjFoTGdRbzd6OS92d0xBMVg0c0FrU1o2UjUzQzBEZ3kvCnN3SURBUUFCbzJZd1pEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWQKQmdOVkhRNEVGZ1FVbG00R3RSbFgzZmYrWkFjLzI1cmdURHNhTEo0d0h3WURWUjBqQkJnd0ZvQVVsbTRHdFJsWAozZmYrWkFjLzI1cmdURHNhTEo0d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFISWVvY1lXM21ZVVdMbTVkR3hvCnN0a01DZlc3aDhDMEduZ2ZIOXFhbFZVTzk0b0RDd2hEMWlqOWtZVW9nZzF3a1BFbGZjSWEybERDOFZBckJtZ3UKWXhFOEJwSkpxMUtIaXAyM0xXSXhWTFB4VWs5ckFUNEtwbE9idmo1RG5adTFDTndlVXJpWU1QUEtRc01LaXROaApVQ3pBV0FVTUpIa2JwVHdsZGNBYmtGMHFyUThGRzZsa1EwakRpTUpKc0ZrelEzbU5YY1pzYXpnamNRWjJHczBxCkhySzlrQ2FHTWtHbzEvQUtDYms5VzZEZDBpL05QeWtvT2d3U1ExMzFSaHQrYmlGZVdVOWQwYjZST3JyYW9GeFoKd1hnZGRYZm11UHQ3eHhyeVFZTUN0NWxRYkQ4aS8wNzJZMGVNYVpQU09jc2xtTk1RQWpsN3Z6T0N0UGcyRzNKNAoxemM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  5.     server: https://-----------------
  6.   name: kubernetes
  7. contexts:
  8. - context:
  9.     cluster: kubernetes
  10.     user: admin
  11.   name: kubernetes
  12. current-context: kubernetes
  13. kind: Config
  14. preferences: {}
  15. users:
  16. - name: admin
  17.   user:
  18.     as-user-extra: {}
  19.     client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lVVnR3RHBzZlRaN1RobUY1SUdYa2ZwWUhrZklzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU0TURNeE1qQTJNamN3TUZvWERUSTRNRE13T1RBMk1qY3dNRm93YXpFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RnpBVgpCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVE4d0RRWURWUVFMRXdaVGVYTjBaVzB4RGpBTUJnTlZCQU1UCkJXRmtiV2x1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0dStsZzRmYzlRT1cKQWxRaWdGTmRHWUZhQjhNaDBuMXRrOFBNUzU2VWRZQmxJMnVNOWNHVTZUdmdGcGJMOFMvMDI2RklmcXZRRlRpQgpqbS9aZEl6R05GbmlOOFk0M3JVWnFTdUtpL3J6czBUU2E3UG5RMnhvOHhiTGNmN24va2NYSEpUSENHbHNhb28xClRmOUdyZGR1bkdWdnhlMzFDT0ovY25LSFZKNVc1aTdoZTlYU21tMWxNdnlkT0FRVmZQT1pJVDNnUS9VV29TL2cKMWI2VEM3cmR5TzhwT2YvYmxOSExFbHRYSk9PcjJOb2ducnJPSk9WYTlTbnQ5S2FBUjNvNnFSM21QR1hnK2pBawpFZGswVzlwMm4rMWpjd094WUd2N1JtQm11Q3QwRnBvaDVBanZPNlhCQTYvSU10WnJkR0tKS1J6NTFZZDRLNHVwCnBQM05jcHhRV3dJREFRQUJvMzh3ZlRBT0JnTlZIUThCQWY4RUJBTUNCYUF3SFFZRFZSMGxCQll3RkFZSUt3WUIKQlFVSEF3RUdDQ3NHQVFVRkJ3TUNNQXdHQTFVZEV3RUIvd1FDTUFBd0hRWURWUjBPQkJZRUZJWTNkNWlFK2VyKwo0M3lRaFVlWkhrRXRUM3JRTUI4R0ExVWRJd1FZTUJhQUZKWnVCclVaVjkzMy9tUUhQOXVhNEV3N0dpeWVNQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFCWGM2cWNSOHQ4dFhHYjRUK0l3clVCd0RvVHhVSWtRQ0p5M1NaT09jZ1AKcnRKalFtNGhPSDhMd1NFcHBHQ2JjV1JxeWRZTzVUQ1Y4K1kzbGQvUzd6TWJIUmNnU2IvczlBbERjbHZZR1daago3akk0TEs4K1lJSXIwVWJtTDdOZWlaMzAxcWorRmlaeElBNkVxN284Y29WWFhlYmpYQUtKKzFva0lqWVoxaGlxCmlBaHRTeXh0MTZQQVlla0NYdGl1U2tGTGNRSUZCYUk5REo4RlpuZDVnbkJnQUloLzlVUFVNR1hDUjhwdkJscFUKeWlGb0puOUtSY3YzQVEwSVJRejkwVzhUMHVYTHdXaU5SM2E2YU5uc1hVZmloaXAwY1VKWXNRODAvb0dIbHJHeApzQktvRVN1QXNSbnE3N25DWmlRUlliZmtEQVZpc0d3KzZHWTNpMnJVUXpDZwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
五:ETCD叢集通訊設定
  1. ETCD_CERT_FILE="/etc/kubernetes/ssl/kubernetes.pem"
  2. ETCD_KEY_FILE="/etc/kubernetes/ssl/kubernetes-key.pem"
  3. ETCD_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"
  4. ETCD_PEER_CERT_FILE="/etc/kubernetes/ssl/kubernetes.pem"
  5. ETCD_PEER_KEY_FILE="/etc/kubernetes/ssl/kubernetes-key.pem"
  6. ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem"
--cert-file--key-file 設定ETCD的公私鑰;--peer-cert-file,--peer-key-file設定ETCD叢集各節點之間通訊的公私鑰;--trusted-ca-file=設定客戶端CA證書;--peer-trusted-ca-file設定ETCD叢集各節點CA證書。

六:API Server與ETCD叢集通訊設定(apiserver配置檔案

點選(此處)摺疊或開啟

  1. --etcd-cafile=/etc/kubernetes/ssl/ca.pem 
  2. --etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem 
  3. --etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem
七:API Server與Kubelet之間通訊設定

1.Master節點生成token.csv檔案;並在apiserver配置檔案中由--token-auth-file引數指定。用於驗證來自kubelet的bootstrap.kubeconfig檔案.
token.csv為一個使用者的描述檔案,基本格式為 Token,使用者名稱,UID,使用者組;這個檔案在 apiserver 啟動時被 apiserver 載入,然後就相當於在叢集內建立了一個這個使用者;接下來就可以用 RBAC 給他授權;持有這個使用者 Token 的元件訪問 apiserver 的時候,apiserver 根據 RBAC 定義的該使用者應當具有的許可權來處理相應請求

點選(此處)摺疊或開啟

  1. 2c691a233d152b582f69de61e40dfc32,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
2.kubelet配置bootstrap.kubeconfig檔案

點選(此處)摺疊或開啟

  1. export KUBE_APISERVER="https://masterIp:6443"
  2. # 設定叢集引數
  3. kubectl config set-cluster kubernetes \
  4. --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  5. --embed-certs=true \
  6. --server=${KUBE_APISERVER} \
  7. --kubeconfig=bootstrap.kubeconfig

  8. # 設定客戶端認證引數
  9. kubectl config set-credentials kubelet-bootstrap \
  10. --token=${BOOTSTRAP_TOKEN} \
  11. --kubeconfig=bootstrap.kubeconfig
  12. # 設定上下?引數
  13. kubectl config set-context default \
  14. --cluster=kubernetes \
  15. --user=kubelet-bootstrap \
  16. --kubeconfig=bootstrap.kubeconfig
  17. # 設定預設上下?
  18. kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
在 apiserver 配置中指定了一個 token.csv 檔案,該檔案中是一個預設的使用者配置;同時該使用者的 Token 和 apiserver 的 CA 證書被寫入了 kubelet 所使用的 bootstrap.kubeconfig 配置檔案中;這樣在首次請求時,kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 證書來與 apiserver 建立 TLS 通訊,使用 bootstrap.kubeconfig 中的使用者 Token 來向 apiserver 宣告自己的 RBAC 授權身份.

3.建立一個 ClusterRoleBinding,將預設使用者 kubelet-bootstrap 與內建的 ClusterRole system:node-bootstrapper 繫結到一起,使其能夠發起 CSR 請求

點選(此處)摺疊或開啟

  1. cd /etc/kubernetes
  2. kubectl create clusterrolebinding kubelet-bootstrap \
  3. --clusterrole=system:node-bootstrapper \
  4. --user=kubelet-bootstrap
4.在 kubelet 首次啟動後,如果使用者 Token 沒問題,並且 RBAC 也做了相應的設定,那麼此時在叢集內應該能看到 kubelet 發起的 CSR 請求,可以使用 kubectl 手動簽發(允許) kubelet 的證書,當成功簽發證書後,目標節點的 kubelet 會將證書寫入到 --cert-dir= 選項指定的目錄中.

至此,API Server和kubelet之間可以通過TLS進行相互通訊。

八:Pod與API Server之間通訊設定

1.使用API Server私鑰(controller-manager配置檔案中的--service-account-private-key-file指定的檔案)建立一個Token(JWT Token),並用該Token、CA證書(這個是API Server的CA公鑰證書,來源於controller-manager配置檔案中的root-ca-file),Namespace名稱等三個資訊產生一個新的Secret物件,然後放入建立的Service Account中

2.API Server收到Token以後,採用自己的私鑰(實際是使用apiserver配置檔案中的引數service-account-key-file指定的私鑰,如果此引數沒有設定,則預設採用tls-private-key-file指定的引數,即自己的私鑰)對Token進行合法驗證。

九:API Server與kube-proxy之間通訊設定

點選(此處)摺疊或開啟

  1. export KUBE_APISERVER="https://masterIp:6443"
  2. # 設定叢集引數
  3. kubectl config set-cluster kubernetes \
  4. --certificate-authority=/etc/kubernetes/ssl/ca.pem \
  5. --embed-certs=true \
  6. --server=${KUBE_APISERVER} \
  7. --kubeconfig=kube-proxy.kubeconfig
  8. # 設定客戶端認證引數
  9. kubectl config set-credentials kube-proxy \
  10. --client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \
  11. --client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \
  12. --embed-certs=true \
  13. --kubeconfig=kube-proxy.kubeconfig
  14. # 設定上下?引數
  15. kubectl config set-context default \
  16. --cluster=kubernetes \
  17. --user=kube-proxy \
  18. --kubeconfig=kube-proxy.kubeconfig
  19. # 設定預設上下?
  20. kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
kube-proxy.pem 證書中 CN 為 system:kube-proxy,kubeapiserver預定義的 RoleBinding cluster-admin 將User system:kube-proxy 與 Role system:node-proxier 繫結,該 Role授予了調? kube-apiserver Proxy 相關 API 的許可權;
生成的kube-proxy.kubeconfig檔案如下:

點選(此處)摺疊或開啟

  1. apiVersion: v1
  2. clusters:
  3. - cluster:
  4.     certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVSVprZlNwNSs5REY3OUZEYXFhQ1haYXRsOG9Rd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU0TURNeE1qQTFNall3TUZvWERUSXpNRE14TVRBMU1qWXdNRm93WlRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByZFdKbGNtNWxkR1Z6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcERaU3NjQWF2N3Roa0JDUTZYN2cKWGZCZ3JOZWM2amc1YjdzVXEzSENyc1hYL3dlOW5POVNxVmxGdS8vY3VMTXNiWEhTdGhXYzJtTXBhdzlmQWVUdwpqK2gyOVZjTkJEamhWbzNhbUFZNk9pR1hOWWZQd0hsaHN4bVFXT0Zrc1NybnpOaGk4djc5K0R5bk1Bc3BSVHlxCk5KODdSUi93d0x6TDVUcFlka1U2U3dIK1ZsR01NRjNEMFdRSjV1ZHlNbFBiRnQyWVVnZE1VRXVCdDRVYWp3d2cKZE9jSVdEcFV0Q0pGNXUvU3RTaHA3RDdRb05rUDdKa2dodm5KMEx6enZxZnlkVFE2MW1HSXIvUHpYS0d3VkJoTgpEQ0hCMTJ1SDBEUkxwK3V2UE5pdmRYcS9wSzE0dWlxYjFoTGdRbzd6OS92d0xBMVg0c0FrU1o2UjUzQzBEZ3kvCnN3SURBUUFCbzJZd1pEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWQKQmdOVkhRNEVGZ1FVbG00R3RSbFgzZmYrWkFjLzI1cmdURHNhTEo0d0h3WURWUjBqQkJnd0ZvQVVsbTRHdFJsWAozZmYrWkFjLzI1cmdURHNhTEo0d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFISWVvY1lXM21ZVVdMbTVkR3hvCnN0a01DZlc3aDhDMEduZ2ZIOXFhbFZVTzk0b0RDd2hEMWlqOWtZVW9nZzF3a1BFbGZjSWEybERDOFZBckJtZ3UKWXhFOEJwSkpxMUtIaXAyM0xXSXhWTFB4VWs5ckFUNEtwbE9idmo1RG5adTFDTndlVXJpWU1QUEtRc01LaXROaApVQ3pBV0FVTUpIa2JwVHdsZGNBYmtGMHFyUThGRzZsa1EwakRpTUpKc0ZrelEzbU5YY1pzYXpnamNRWjJHczBxCkhySzlrQ2FHTWtHbzEvQUtDYms5VzZEZDBpL05QeWtvT2d3U1ExMzFSaHQrYmlGZVdVOWQwYjZST3JyYW9GeFoKd1hnZGRYZm11UHQ3eHhyeVFZTUN0NWxRYkQ4aS8wNzJZMGVNYVpQU09jc2xtTk1RQWpsN3Z6T0N0UGcyRzNKNAoxemM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  5.     server: https://-----------------
  6.   name: kubernetes
  7. contexts:
  8. - context:
  9.     cluster: kubernetes
  10.     user: kube-proxy
  11.   name: default
  12. current-context: default
  13. kind: Config
  14. preferences: {}
  15. users:
  16. - name: kube-proxy
  17.   user:
  18.     as-user-extra: {}
  19.     client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzakNDQXNhZ0F3SUJBZ0lVTCtlZWYzVmJjenZiZFBueUxCdXlMTmJlWFVNd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbAphVXBwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU0TURNeE1qQTJOVEl3TUZvWERUSTRNRE13T1RBMk5USXdNRm93YkRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFVcHBibWN4RURBT0JnTlZCQWNUQjBKbGFVcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUm93R0FZRFZRUURFeEZ6ZVhOMFpXMDZhM1ZpClpTMXdjbTk0ZVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTHo5bzVJTk5jMWgKU1NSeEs5SU5TcmhPZm4wcHV4dlF0cUp2Yzl0UFNUVXQ3QkZLT1h6dXd2VkowY1hKV201M2xZTEtObm9oSnljdgpsTElZSUhBMXFDa1hOTnNrc2huRlJPYmNmTFZMWU50cXV6WDBoQm5vaUtPYU8vYzUrVEpIYW41a1R3YXhSNklNCmZNNitlZkxTYUU0VGUzenRwVHVMVjlUT2QyZEdJTHpJRm1BSDFmZW5VNnJvUEsxcEtHbjZjUmlKZXk5S1VSNzIKWHpsZXZONWplTCs5cXNWSitINVo3ZFdrd21iQ2VqdWxYNVpZUmxZYm5sdSsxZ2syRXN0Z0NEODUrdldvYklHVgpJTkZmS2Q2YW1jN0E2cnVhQTh4aW54RTNtOFpuQmQzaFMyNktZSUlQVUExTGxNb05KTHBUK0Z4ZlA2MFN2bXBIClZWQktXSURUSDlVQ0F3RUFBYU4vTUgwd0RnWURWUjBQQVFIL0JBUURBZ1dnTUIwR0ExVWRKUVFXTUJRR0NDc0cKQVFVRkJ3TUJCZ2dyQmdFRkJRY0RBakFNQmdOVkhSTUJBZjhFQWpBQU1CMEdBMVVkRGdRV0JCUWR5M0pidTVYNQoxbE9PcTFWRzZRbDBuM1JxblRBZkJnTlZIU01FR0RBV2dCU1diZ2ExR1ZmZDkvNWtCei9ibXVCTU94b3NuakFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVcxWWNhdGlTVS9XVFZzc2R2dVNwdGpUQllleGhrZlhSMjNIU3VnYUIKM1J4T2JscG5ETEtWdVVxY2dZMnIrTEU2SEFKZG9scEVydlc0RDRISFgzbW8wVTdFdlZVNUlvU1JmQ2p4dTZmaApDK0VsbzcybmFPNW96Y2NVbXcwaisrKzN6UzFZTnE0LzF0ZzhTd1NBOWx0alI5SU9kOHY4ZS91UWJnN2ZuMHJnCmxsR28rb0dxa0JaSDlnQzROc0Frd1haYUJPWWxjcDJEN244S2dqRS9DaWsxWDZzSDJiL0tPb1ZHR3NiTDRwY1QKMUxlOFFROWk4dDRlclI3OFlFVFFwZnJVbkZjUndlZTkvbDJSeVBDRDROSVpiZ0U5UXVCWW9nMUc3bjNYWG9DNwpFNUtWdUFXRkJraFBEaG44MU9RczRkamtBWkFIaEF1c1ZSUTByTzlPeVpodG53PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2153070/,如需轉載,請註明出處,否則將追究法律責任。

相關文章