【K8s任務】配置 Pod 使用 ConfigMap
參考:https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-pod-configmap/
ConfigMap 允許你將配置檔案與映象檔案分離,以使容器化的應用程式具有可移植性。 本頁提供了一系列使用示例,這些示例演示瞭如何建立 ConfigMap 以及配置 Pod 使用儲存在 ConfigMap 中的資料。
建立 ConfigMap
你可以使用 kubectl create configmap 或者在 kustomization.yaml 中的 ConfigMap 生成器 來建立 ConfigMap。注意,kubectl 從 1.14 版本開始支援 kustomization.yaml。
使用 kubectl create configmap 建立 ConfigMap
你可以使用 kubectl create configmap 命令基於 目錄、檔案 或者字面值來建立 ConfigMap:
kubectl create configmap <map-name> <data-source>
其中,<map-name> 是要設定的 ConfigMap 名稱,<data-source> 是要從中提取資料的目錄、 檔案或者字面值。 ConfigMap 物件的名稱必須是合法的 DNS 子域名.
在你基於檔案來建立 ConfigMap 時,<data-source> 中的鍵名預設取自 檔案的基本名,而對應的值則預設為檔案的內容。
你可以使用kubectl describe 或者 kubectl get 獲取有關 ConfigMap 的資訊。
基於目錄建立 ConfigMap
你可以使用 kubectl create configmap 基於同一目錄中的多個檔案建立 ConfigMap。 當你基於目錄來建立 ConfigMap 時,kubectl 識別目錄下基本名可以作為合法鍵名的 檔案,並將這些檔案打包到新的 ConfigMap 中。普通檔案之外的所有目錄項都會被 忽略(例如,子目錄、符號連結、裝置、管道等等)。
例如:
# 建立本地目錄 mkdir -p configure-pod-container/configmap/ # 將例項檔案下載到 `configure-pod-container/configmap/` 目錄 wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties # 建立 configmap kubectl create configmap game-config --from-file=configure-pod-container/configmap/
以上命令將 configure-pod-container/configmap 目錄下的所有檔案,也就是 game.properties 和 ui.properties 打包到 game-config ConfigMap 中。你可以使用下面的命令顯示 ConfigMap 的詳細資訊:
kubectl describe configmaps game-config
輸出類似以下內容:
Name: game-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
configure-pod-container/configmap/ 目錄中的 game.properties 和 ui.properties 檔案出現在 ConfigMap 的 data 部分。
kubectl get configmaps game-config -o yaml
輸出類似以下內容:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T18:52:05Z
name: game-config
namespace: default
resourceVersion: "516"
selfLink: /api/v1/namespaces/default/configmaps/game-config
uid: b4952dc3-d670-11e5-8cd0-68f728db1985
data:
game.properties: |
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties: |
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
基於檔案建立 ConfigMap
你可以使用 kubectl create configmap 基於單個檔案或多個檔案建立 ConfigMap。
例如:
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties
將產生以下 ConfigMap:
kubectl describe configmaps game-config-2
輸出類似以下內容:
Name: game-config-2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
你可以多次使用 --from-file 引數,從多個數據源建立 ConfigMap。
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties
描述上面建立的 game-config-2 configmap
kubectl describe configmaps game-config-2
輸出類似以下內容:
Name: game-config-2
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
當 kubectl 基於非 ASCII 或 UTF-8 的輸入建立 ConfigMap 時, 該工具將這些輸入放入 ConfigMap 的 binaryData 欄位,而不是 data 中。 同一個 ConfigMap 中可同時包含文字資料和二進位制資料來源。 如果你想檢視 ConfigMap 中的 binaryData 鍵(及其值), 你可以執行 kubectl get configmap -o jsonpath='{.binaryData}'
使用 --from-env-file 選項從環境檔案建立 ConfigMap,例如:
Env 檔案包含環境變數列表。 其中適用以下語法規則:
Env 檔案中的每一行必須為 VAR=VAL 格式。
以#開頭的行(即註釋)將被忽略。
空行將被忽略。
引號不會被特殊處理(即它們將成為 ConfigMap 值的一部分)。
將示例檔案下載到 configure-pod-container/configmap/ 目錄
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
env 檔案 game-env-file.properties 如下所示:
cat configure-pod-container/configmap/game-env-file.properties
enemies=aliens
lives=3
allowed="true"
kubectl create configmap game-config-env-file \
--from-env-file=configure-pod-container/configmap/game-env-file.properties
將產生以下 ConfigMap:
kubectl get configmap game-config-env-file -o yaml
輸出類似以下內容:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2017-12-27T18:36:28Z
name: game-config-env-file
namespace: default
resourceVersion: "809965"
selfLink: /api/v1/namespaces/default/configmaps/game-config-env-file
uid: d9d1ca5b-eb34-11e7-887b-42010a8002b8
data:
allowed: '"true"'
enemies: aliens
lives: "3"
注意: 當多次使用 --from-env-file 來從多個數據源建立 ConfigMap 時,僅僅最後一個 env 檔案有效。
下面是一個多次使用 --from-env-file 引數的示例:
# 將樣本檔案下載到 `configure-pod-container/configmap/` 目錄
wget https://k8s.io/examples/configmap/ui-env-file.properties -O configure-pod-container/configmap/ui-env-file.properties
# 建立 configmap
kubectl create configmap config-multi-env-files \
--from-env-file=configure-pod-container/configmap/game-env-file.properties \
--from-env-file=configure-pod-container/configmap/ui-env-file.properties
將產生以下 ConfigMap:
kubectl get configmap config-multi-env-files -o yaml
輸出類似以下內容:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2017-12-27T18:38:34Z
name: config-multi-env-files
namespace: default
resourceVersion: "810136"
selfLink: /api/v1/namespaces/default/configmaps/config-multi-env-files
uid: 252c4572-eb35-11e7-887b-42010a8002b8
data:
color: purple
how: fairlyNice
textmode: "true"
定義從檔案建立 ConfigMap 時要使用的鍵
在使用 --from-file 引數時,你可以定義在 ConfigMap 的 data 部分出現鍵名, 而不是按預設行為使用檔名:
kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>
<my-key-name> 是你要在 ConfigMap 中使用的鍵名,<path-to-file> 是你想要鍵表示資料來源檔案的位置。
例如:
kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties
將產生以下 ConfigMap:
kubectl get configmaps game-config-3 -o yaml
輸出類似以下內容:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T18:54:22Z
name: game-config-3
namespace: default
resourceVersion: "530"
selfLink: /api/v1/namespaces/default/configmaps/game-config-3
uid: 05f8da22-d671-11e5-8cd0-68f728db1985
data:
game-special-key: |
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
根據字面值建立 ConfigMap
你可以將 kubectl create configmap 與 --from-literal 引數一起使用,從命令列定義文字值:
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
你可以傳入多個鍵值對。命令列中提供的每對鍵值在 ConfigMap 的 data 部分中均表示為單獨的條目。
kubectl get configmaps special-config -o yaml
輸出類似以下內容:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T19:14:38Z
name: special-config
namespace: default
resourceVersion: "651"
selfLink: /api/v1/namespaces/default/configmaps/special-config
uid: dadce046-d673-11e5-8cd0-68f728db1985
data:
special.how: very
special.type: charm
基於生成器建立 ConfigMap
自 1.14 開始,kubectl 開始支援 kustomization.yaml。 你還可以基於生成器建立 ConfigMap,然後將其應用於 API 伺服器上建立物件。 生成器應在目錄內的 kustomization.yaml 中指定。
基於檔案生成 ConfigMap
例如,要從 configure-pod-container/configmap/kubectl/game.properties 檔案生成一個 ConfigMap:
# 建立包含 ConfigMapGenerator 的 kustomization.yaml 檔案
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-4
files:
- configure-pod-container/configmap/kubectl/game.properties
EOF
使用 kustomization 目錄建立 ConfigMap 物件:
kubectl apply -k .
configmap/game-config-4-m9dm2f92bt created
你可以檢查 ConfigMap 是這樣建立的:
kubectl get configmap
NAME DATA AGE
game-config-4-m9dm2f92bt 1 37s
kubectl describe configmaps/game-config-4-m9dm2f92bt
Name: game-config-4-m9dm2f92bt
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.p...
Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
Events: <none>
請注意,生成的 ConfigMap 名稱具有通過對內容進行雜湊而附加的字尾, 這樣可以確保每次修改內容時都會生成新的 ConfigMap。
定義從檔案生成 ConfigMap 時要使用的鍵
在 ConfigMap 生成器,你可以定義一個非檔名的鍵名。 例如,從 configure-pod-container/configmap/game.properties 檔案生成 ConfigMap, 但使用 game-special-key 作為鍵名:
# 建立包含 ConfigMapGenerator 的 kustomization.yaml 檔案
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-5
files:
- game-special-key=configure-pod-container/configmap/kubectl/game.properties
EOF
使用 Kustomization 目錄建立 ConfigMap 物件。
kubectl apply -k .
configmap/game-config-5-m67dt67794 created
從字面值生成 ConfigMap
要基於字串 special.type=charm 和 special.how=very 生成 ConfigMap, 可以在 kusotmization.yaml 中配置 ConfigMap 生成器:
# 建立帶有 ConfigMapGenerator 的 kustomization.yaml 檔案
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: special-config-2
literals:
- special.how=very
- special.type=charm
EOF
應用 Kustomization 目錄建立 ConfigMap 物件。
kubectl apply -k .
configmap/special-config-2-c92b5mmcf2 created
使用 ConfigMap 資料定義容器環境變數
使用單個 ConfigMap 中的資料定義容器環境變數
1.在 ConfigMap 中將環境變數定義為鍵值對:
kubectl create configmap special-config --from-literal=special.how=very
2.將 ConfigMap 中定義的 special.how 值分配給 Pod 規範中的 SPECIAL_LEVEL_KEY 環境變數。
pods/pod-single-configmap-env-variable.yaml [Copy pods/pod-single-configmap-env-variable.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
# Define the environment variable
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
# The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
name: special-config
# Specify the key associated with the value
key: special.how
restartPolicy: Never
建立 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-single-configmap-env-variable.yaml
現在,Pod 的輸出包含環境變數 SPECIAL_LEVEL_KEY=very。
使用來自多個 ConfigMap 的資料定義容器環境變數
1.與前面的示例一樣,首先建立 ConfigMap。
configmap/configmaps.yaml [Copy configmap/configmaps.yaml to clipboard]
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
建立 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmaps.yaml
2.在 Pod 規範中定義環境變數。
pods/pod-multiple-configmap-env-variable.yaml [Copy pods/pod-multiple-configmap-env-variable.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: env-config
key: log_level
restartPolicy: Never
建立 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-multiple-configmap-env-variable.yaml
現在,Pod 的輸出包含環境變數 SPECIAL_LEVEL_KEY=very 和 LOG_LEVEL=INFO。
將 ConfigMap 中的所有鍵值對配置為容器環境變數
說明: Kubernetes v1.6 和更高版本支援此功能。
1.建立一個包含多個鍵值對的 ConfigMap。
configmap/configmap-multikeys.yaml [Copy configmap/configmap-multikeys.yaml to clipboard]
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
建立 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml
2.使用 envFrom 將所有 ConfigMap 的資料定義為容器環境變數,ConfigMap 中的鍵成為 Pod 中的環境變數名稱。
pods/pod-configmap-envFrom.yaml [Copy pods/pod-configmap-envFrom.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: special-config
restartPolicy: Never
建立 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-envFrom.yaml
現在,Pod 的輸出包含環境變數 SPECIAL_LEVEL=very 和 SPECIAL_TYPE=charm。
在 Pod 命令中使用 ConfigMap 定義的環境變數
你可以使用 $(VAR_NAME) Kubernetes 替換語法在容器的 command 和 args 部分中使用 ConfigMap 定義的環境變數。
例如,以下 Pod 規範
pods/pod-configmap-env-var-valueFrom.yaml [Copy pods/pod-configmap-env-var-valueFrom.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_LEVEL
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_TYPE
restartPolicy: Never
通過執行下面命令建立 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-env-var-valueFrom.yaml
在 test-container 容器中產生以下輸出:
very charm
將 ConfigMap 資料新增到一個卷中
如基於檔案建立 ConfigMap 中所述,當你使用 --from-file 建立 ConfigMap 時,檔名成為儲存在 ConfigMap 的 data 部分中的鍵, 檔案內容成為鍵對應的值。
本節中的示例引用了一個名為 special-config 的 ConfigMap,如下所示:
configmap/configmap-multikeys.yaml [Copy configmap/configmap-multikeys.yaml to clipboard]
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
SPECIAL_LEVEL: very
SPECIAL_TYPE: charm
建立 ConfigMap:
kubectl create -f https://kubernetes.io/examples/configmap/configmap-multikeys.yaml
使用儲存在 ConfigMap 中的資料填充資料卷
在 Pod 規約的 volumes 部分下新增 ConfigMap 名稱。 這會將 ConfigMap 資料新增到指定為 volumeMounts.mountPath 的目錄(在本例中為 /etc/config)。 command 部分引用儲存在 ConfigMap 中的 special.level。
pods/pod-configmap-volume.yaml [Copy pods/pod-configmap-volume.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
restartPolicy: Never
建立 Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume.yaml
Pod 執行時,命令 ls /etc/config/ 產生下面的輸出:
SPECIAL_LEVEL
SPECIAL_TYPE
注意: 如果在 /etc/config/ 目錄中有一些檔案,它們將被刪除。
說明: 文字資料會使用 UTF-8 字元編碼的形式展現為檔案。如果使用其他字元編碼, 可以使用 binaryData。
將 ConfigMap 資料新增到資料卷中的特定路徑
使用 path 欄位為特定的 ConfigMap 專案指定預期的檔案路徑。 在這裡,ConfigMap中,鍵值 SPECIAL_LEVEL 的內容將掛載在 config-volume 資料卷中 /etc/config/keys 檔案下。
pods/pod-configmap-volume-specific-key.yaml [Copy pods/pod-configmap-volume-specific-key.yaml to clipboard]
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh","-c","cat /etc/config/keys" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
items:
- key: SPECIAL_LEVEL
path: keys
restartPolicy: Never
建立Pod:
kubectl create -f https://kubernetes.io/examples/pods/pod-configmap-volume-specific-key.yaml
當 pod 執行時,命令 cat /etc/config/keys 產生以下輸出:
very
注意: 如前,/etc/config/ 目錄中所有先前的檔案都將被刪除。
對映鍵以指定路徑和檔案許可權
你可以通過指定鍵名到特定目錄的投射關係,也可以逐個檔案地設定訪問許可權。 Secret 使用者指南 中對這一語法提供瞭解釋。
掛載的 ConfigMap 將自動更新
更新已經在資料卷中使用的 ConfigMap 時,已對映的鍵最終也會被更新。 kubelet 在每次定期同步時都會檢查已掛載的 ConfigMap 是否是最新的。 但是,它使用其本地的基於 TTL 的快取來獲取 ConfigMap 的當前值。 因此,從更新 ConfigMap 到將新鍵對映到 Pod 的總延遲可能與 kubelet 同步週期 + ConfigMap 在 kubelet 中快取的 TTL 一樣長。
說明: 使用 ConfigMap 作為 subPath 的資料卷將不會收到 ConfigMap 更新。
瞭解 ConfigMap 和 Pod
ConfigMap API 資源將配置資料儲存為鍵值對。 資料可以在 Pod 中使用,也可以提供系統元件(如控制器)的配置。 ConfigMap 與 Secret 類似, 但是提供了一種使用不包含敏感資訊的字串的方法。 使用者和系統元件都可以在 ConfigMap 中儲存配置資料。
說明: ConfigMap 應該引用屬性檔案,而不是替換它們。可以將 ConfigMap 理解為類似於 Linux /etc 目錄及其內容的東西。例如,如果你從 ConfigMap 建立 Kubernetes 卷,則 ConfigMap 中的每個資料項都由該資料卷中的單個檔案表示。
ConfigMap 的 data 欄位包含配置資料。如下例所示,它可以簡單 (如用 --from-literal 的單個屬性定義)或複雜 (如用 --from-file 的配置檔案或 JSON blob定義)。
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: 2016-02-18T19:14:38Z
name: example-config
namespace: default
data:
# 使用 --from-literal 定義的簡單屬性
example.property.1: hello
example.property.2: world
# 使用 --from-file 定義複雜屬性的例子
example.property.file: |-
property.1=value-1
property.2=value-2
property.3=value-3
限制
在 Pod 規範中引用之前,必須先建立一個 ConfigMap(除非將 ConfigMap 標記為"可選")。 如果引用的 ConfigMap 不存在,則 Pod 將不會啟動。同樣,引用 ConfigMap 中不存在的鍵也會阻止 Pod 啟動。
如果你使用 envFrom 基於 ConfigMap 定義環境變數,那麼無效的鍵將被忽略。 可以啟動 Pod,但無效名稱將記錄在事件日誌中(InvalidVariableNames)。 日誌訊息列出了每個跳過的鍵。例如:
kubectl get events
輸出與此類似:
LASTSEEN FIRSTSEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE
0s 0s 1 dapi-test-pod Pod Warning InvalidEnvironmentVariableNames {kubelet, 127.0.0.1} Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names.
ConfigMap 位於特定的名字空間 中。每個 ConfigMap 只能被同一名字空間中的 Pod 引用.
你不能將 ConfigMap 用於 靜態 Pod, 因為 Kubernetes 不支援這種用法。
作者:Varden
出處:http://www.cnblogs.com/varden/
本文內容如有雷同,請聯絡作者!
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。