02 kubernetes 的調(diào)度單元 pod

創(chuàng)建第一個(gè) pod

創(chuàng)建 nginx pod

編寫 yaml 文件

cd ~
vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  labels:
    name: my-nginx
spec:
  containers:
  - name: my-nginx
    image: nginx
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
    ports:
      - containerPort: 80

創(chuàng)建 pod

kubectl apply -f nginx.yaml

查看 pod

kubectl get po

可以看到

NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          57s

查看詳細(xì)信息

kubectl describe pod my-nginx

使用 job 創(chuàng)建 pod

cd ~
vim hellojob.yaml

編寫 job 向胡,hello 這個(gè) job 會(huì)跑 5 次 pod

apiVersion: batch/v1
kind: Job
metadata:
  name: hello
spec:
  completions: 5
  template:
    # 以下是 Pod 
    spec:
      containers:
      - name: hello
        image: nginx
        command: ['sh', '-c', 'echo "Hello, Kubernetes! " && sleep 2']
      restartPolicy: OnFailure

創(chuàng)建 job

kubectl create -f hellojob.yaml
kubectl get job
kubectl get po
kubectl get po -w
kubectl get po -w
kubectl delete job hello

為容器的生命周期事件設(shè)置處理函數(shù)

創(chuàng)建一個(gè)包含一個(gè)容器的 Pod 厌均,該容器為 postStart 和 preStop 事件提供對應(yīng)的處理函數(shù)

在從節(jié)點(diǎn) node1 :

cd ~
vim lifecycle.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

kubectl create -f lifecycle.yaml
kubectl get po
kubectl exec -it lifecycle-demo sh
ls
cat /usr/share/message

可以看到

Hello from the postStart handler

創(chuàng)建包含 Init 容器的 Pod

Init 容器

每個(gè) pod 中可以包含多個(gè)容器艾杏,應(yīng)用運(yùn)行在這些容器里面殿托,同時(shí) Pod 也可以有一個(gè)或多個(gè)先于應(yīng)用容器啟動(dòng)的 Init 容器

Init 容器與普通的容器非常像褪秀,除了如下兩點(diǎn):

  1. 它們總是運(yùn)行到完成

  2. 每個(gè)都必須在下一個(gè)啟動(dòng)之前成功完成

    如果 pod 的 Init 容器失敗三幻,Kubernetes 會(huì)不斷重啟該 pod 碍侦,知道 Init 容器成功為止邢隧。如果 pod 對應(yīng)的 restartPolicy 值為 Never 店印,Kubernetes 不會(huì)重新啟動(dòng) pod

與普通容器的不同之處

Init 容器支持應(yīng)用容器的全部屬性和特性,包括資源限制倒慧、數(shù)據(jù)卷和安全設(shè)置按摘。

同時(shí) Init 容器不支持 lifecycle, livenessProbe, readinessProbe 和 startupProbe, 因?yàn)樗鼈儽仨氃?pod 就緒之前運(yùn)行完成。

定義一個(gè)具有兩個(gè) Init 容器的 pod 纫谅。第一個(gè)等待 myservice 啟動(dòng)炫贤,第二個(gè)等待 mydb 啟動(dòng)。一旦這兩個(gè) Init 容器都啟動(dòng)完成付秕,pod 將啟動(dòng) spec 節(jié)中的應(yīng)用容器兰珍。

cd ~
vim initPod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'date && sleep 3600']
  initContainers:
  - name: init-container
    image: busybox:1.28
    command: ['sh', '-c', "date && sleep 10"]

啟動(dòng) pod

kubectl apply -f initPod.yaml
kubectl get po

查看 pod 日志

kubectl logs myapp-pod
Thu Mar 18 08:52:08 UTC 2021

查看 pod 內(nèi) init 容器的日志

kubectl logs myapp-pod -c init-container
Thu Mar 18 08:51:57 UTC 2021

用探針檢查 pod 的健康性

探針是 kubelet 對容器執(zhí)行的定期診斷,監(jiān)測 pod 里面的容器是不是正常啟動(dòng)了询吴。kubelet 調(diào)用由容器實(shí)現(xiàn)的 Handler 進(jìn)行診斷掠河,Handler 的類型有三種:

  • ExecAction:在容器內(nèi)執(zhí)行指定命令。如果命令退出時(shí)返回碼為 0 則認(rèn)為診斷成功
  • TCPSocketAction:對容器的 ip 地址上的指定端口進(jìn)行 TCP 檢查猛计,如果端口打開唠摹,則認(rèn)為診斷成功。
  • HTTPGetAction:對容器的 ip 地址上的指定端口的路徑執(zhí)行 HTTP Get 請求有滑。如果響應(yīng)的狀態(tài)碼大于等于 200 并且小于 400跃闹,則認(rèn)為診斷是成功的。

每次診斷都將獲得以下三種結(jié)果之一:

  • Success(成功):容器通過了診斷
  • Failure(失敗):容器未通過診斷
  • Unknown(未知):診斷失敗,因此不會(huì)采取任何行動(dòng)

什么時(shí)候使用探針

對于所包含的容器需要比較長的時(shí)間才能啟動(dòng)就緒的 pod 望艺,啟動(dòng)探針是非常有用的苛秕。

HTTP 請求探針

cd ~
vim liveness.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: mirrorgooglecontainers/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

上面官方提供的 liveness 容器,10秒之內(nèi)找默,服務(wù)會(huì)給 /healthz 請求返回 200艇劫,10秒之后,會(huì)返回 500:

http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    duration := time.Now().Sub(started)
    if duration.Seconds() > 10 {
        w.WriteHeader(500)
        w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
    } else {
        w.WriteHeader(200)
        w.Write([]byte("ok"))
    }
})

initialDelaySeconds: 3 字段告訴 kubelet 在執(zhí)行第一次探測之前應(yīng)該等待 3 秒

periodSeconds: 3 字段指定了 kubelet 每隔 3 秒執(zhí)行一次存活探測

啟動(dòng) pod

kubectl apply -f liveness.yaml

觀察 pod

kubectl get po -w

kubelet 在容器啟動(dòng) 3 秒后惩激,開始健康檢測店煞,啟動(dòng)超過 10 秒之后,健康檢查會(huì)失敗风钻,kubelet 會(huì)重啟容器顷蟀。

為容器設(shè)置啟動(dòng)時(shí)要執(zhí)行的命令和參數(shù)

創(chuàng)建 pod 時(shí),可以為其下的容器設(shè)置啟動(dòng)時(shí)要執(zhí)行的命令及參數(shù)骡技。通過 command 字段設(shè)置命令鸣个,通過 args 字段設(shè)置命令的參數(shù)。

cd ~
vim args.yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure

以上布朦,設(shè)置了一個(gè)命令囤萤,兩個(gè)參數(shù)。命令會(huì)打印兩個(gè)參數(shù)是趴。

restartPolicy: OnFailure 字段的意思是:失敗了才會(huì)重啟

創(chuàng)建 pod

kubectl apply -f args.yaml
kubectl get po
kubectl logs command-demo

可以看到涛舍,打印了兩個(gè)參數(shù):

command-demo
tcp://10.1.0.1:443

使用環(huán)境變量設(shè)置參數(shù)

kubectl delete -f args.yaml
vim args.yaml
apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    env:
    - name: MESSAGE
      value: "hello world"
    command: ["/bin/echo"]
    args: ["$(MESSAGE)"]
  restartPolicy: OnFailure
kubectl apply -f args.yaml
kubectl get po -w
kubectl logs command-demo

可以看到:

hello world

為容器定義相互依賴的環(huán)境變量

可以為運(yùn)行在 pod 中的容器設(shè)置相互依賴的環(huán)境變量

vim dependency-var.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dependent-envars-demo
spec:
  containers:
    - name: dependent-envars-demo
      args:
        - printf UNCHANGED_REFERENCE=$UNCHANGED_REFERENCE'\n'; printf SERVICE_ADDRESS=$SERVICE_ADDRESS'\n';printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'\n'; 
      command:
        - sh
        - -c
      image: busybox
      env:
        - name: SERVICE_PORT
          value: "80"
        - name: SERVICE_IP
          value: "192.168.190.131"
        - name: UNCHANGED_REFERENCE
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
        - name: PROTOCOL
          value: "https"
        - name: SERVICE_ADDRESS
          value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
        - name: ESCAPED_REFERENCE
          value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
kubectl apply -f dependency-var.yaml
kubectl get po
kubectl logs dependent-envars-demo

可以看到:

UNCHANGED_REFERENCE=$(PROTOCOL)://192.168.190.131:80
SERVICE_ADDRESS=https://192.168.190.131:80
ESCAPED_REFERENCE=$(PROTOCOL)://192.168.190.131:80

在變量 PROTOCOL 定義之前打印 $(PROTOCOL),會(huì)打铀敉尽:$(PROTOCOL)

打印 $$(PROTOCOL) 會(huì)打痈谎拧:$(PROTOCOL)

為容器和 Pods 分配 CPU 資源

創(chuàng)建一個(gè)命名空間,以便將本次練習(xí)中創(chuàng)建的資源與集群的其余部分資源隔離

kubectl create namespace cpu-example

為容器指定 CPU 請求窘哈,使用字段:

resources: requests

指定 CPU 限制吹榴,使用字段:

resources: limits

創(chuàng)建一個(gè) pod , pod 內(nèi)有一個(gè)容器滚婉,容器請求 0.5 個(gè) CPU 图筹,并且限制最多使用 1 個(gè) CPU

vim cpu-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
    - "2"

arg 提供了容器啟動(dòng)時(shí)的參數(shù),優(yōu)先級高于默認(rèn)的參數(shù)让腹,這里 -cpu "2" 告訴容器嘗試使用 2 個(gè) CPU 远剩,但是結(jié)果并不會(huì)使用 2 個(gè) CPU ,因?yàn)?resources: limits 限制了 CPU 個(gè)數(shù)是 1 骇窍。

安裝 work2

  1. 克隆 work1 虛擬機(jī)瓜晤,鏈接克隆或者完整克隆都可以,命名為 work2 腹纳,克隆完成后痢掠,啟動(dòng) work2 虛擬機(jī)

  2. 修改 ip :vi /etc/sysconfig/network-scripts/ifcfg-ens33

    • IPADDR=192.168.190.133
  3. 重啟網(wǎng)絡(luò):systemctl restart network

  4. 修改 hostname hostnamectl set-hostname node2

    • 查看 hostname :hostname
  5. 重置 kubeadm

    • kubeadm reset
    • 輸入:y
  6. 配置端口轉(zhuǎn)發(fā):

    • echo 1 > /proc/sys/net/ipv4/ip_forward
      echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
      
  7. 將 master 節(jié)點(diǎn)的 admin.conf 復(fù)制到 work2 節(jié)點(diǎn)驱犹,在 master 節(jié)點(diǎn)執(zhí)行:

    • scp /etc/kubernetes/admin.conf root@node2:/etc/kubernetes/
  8. 清理環(huán)境

    • systemctl stop kubelet && systemctl stop docker && rm -rf /var/lib/cni/ && rm -rf /var/lib/kubelet/* && rm -rf /etc/cni/ && ifconfig flannel.1 down && ifconfig docker0 down && ip link delete flannel.1
      
  9. 啟動(dòng) docker 和 kubernetes

    • systemctl start docker && systemctl start kubelet
  10. 在 master 節(jié)點(diǎn)生成 token 給 work2 節(jié)點(diǎn),在 master 節(jié)點(diǎn)執(zhí)行:

    • kubeadm token create --print-join-command
  11. 生成的 token

    • kubeadm join 192.168.190.131:6443 --token hjyu47.u4ezlgt0yuw8jwrf     --discovery-token-ca-cert-hash sha256:1271d25165cffe9623cc85980a5ac950eba7ff066149b590a509d3e09594a09d
      
  12. 復(fù)制到 work2 節(jié)點(diǎn)

  13. 等待半分鐘至1分鐘足画,執(zhí)行:kubectl get nodes

  14. 可以看到:

    • NAME     STATUS   ROLES    AGE   VERSION
      master   Ready    master   30h   v1.19.3
      node1    Ready    <none>   27h   v1.19.3
      node2    Ready    <none>   78s   v1.19.3
      

用節(jié)點(diǎn)親和性把 Pods 分配到節(jié)點(diǎn)

列出集群中的節(jié)點(diǎn)和節(jié)點(diǎn)的標(biāo)簽

kubectl get nodes --show-labels

給節(jié)點(diǎn)添加標(biāo)簽雄驹,這里區(qū)分一下:work1 是虛擬機(jī)的名字;node1 是節(jié)點(diǎn)的名字

kubectl label nodes <your-node-name> disktype=ssd

看一下這個(gè) pod 淹辞,通過 affinity 指定了 disktypessd 的節(jié)點(diǎn)

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd            
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

可以通過 kubectl get pods --output=wide 查看 pod 運(yùn)行在哪個(gè)節(jié)點(diǎn)

將 ConfigMap 中的兼職對配置為容器環(huán)境變量

vim config.yaml

下面的內(nèi)容医舆,包含 configmap 和 pod

# configmap
apiVersion: v1
kind: ConfigMap
metadata:
# configmap 的名字
  name: my-db-config
# configmap 的數(shù)據(jù)
data:
  db-url: localhost
---
# pod
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: busybox
    # 命令:寫入環(huán)境變量
    command: ["sh","-c","env"]
    # 環(huán)境變量來自于:
    envFrom:
    # 指定 configmap
      - configMapRef:
          name: my-db-config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"

一次創(chuàng)建 configmap 和 pod 兩個(gè)對象

kubectl create -f configmap.yaml

可以看到:

configmap/my-db-config created
pod/myapp created

查看日志

kubectl logs myapp

可以看到 db-url=localhost 已經(jīng)寫入環(huán)境變量

容器 Root 用戶 VS privileged

大多數(shù)容器默認(rèn)以 root 身份運(yùn)行,不過為了安全象缀,默認(rèn)的 root 用戶實(shí)際上是映射的 root 用戶蔬将,并不具備 root 用戶的全部功能,如果需要更大的權(quán)限央星,需要使用特權(quán)用戶霞怀,在運(yùn)行容器的時(shí)候,加上 --privileged 參數(shù)莉给。

[root@node1 ~]# docker run -it busybox sh
/ # whoami
root
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
/ # hostname
af29e1748ec7
/ # sysctl kernel.hostname=Attacker
sysctl: error setting key 'kernel.hostname': Read-only file system
/ # exit
[root@node1 ~]#

上面的例子里烦,以默認(rèn)的 root 用戶運(yùn)行容器,在修改 hostname 的時(shí)候禁谦,提示沒有權(quán)限。

下面的例子废封,在運(yùn)行容器的時(shí)候州泊,加上 --privileged 參數(shù),以特權(quán)用戶運(yùn)行

[root@node1 ~]# docker run -it --privileged busybox sh
/ # whoami
root
/ # id
uid=0(root) gid=0(root) groups=10(wheel)
/ # hostname
c21cf0211dc1
/ # sysctl kernel.hostname=Attacker
kernel.hostname = Attacker
/ # hostname
Attacker
/ # exit
[root@node1 ~]#

可以看到漂洋,hostname 修改成功了遥皂。

Kubernetes 通過 Security Context 提供了相同的功能


apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      privileged: true

為 Pod 創(chuàng)建非 Root 用戶運(yùn)行

創(chuàng)建一個(gè)設(shè)置 Security Context 的 pod

vim security.yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    # 容器內(nèi)所有進(jìn)程都以 1000 這個(gè)用戶id來運(yùn)行
    runAsUser: 1000
    # 進(jìn)程都以主組id 3000 來運(yùn)行,所有創(chuàng)建的文件刽漂,也劃歸用戶1000和主組3000演训;如果忽略此字段,則容器的主組id將是root(0)
    runAsGroup: 3000
    # 容器中所有進(jìn)程也會(huì)是附組id2000的一部分贝咙。卷/data/demo及在該卷中創(chuàng)建的任何文件的屬主都會(huì)是組id 2000
    fsGroup: 2000
  # 在宿主機(jī)上掛載一個(gè)空目錄样悟,存放這個(gè) pod 里面的內(nèi)容
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    # 引用掛載的目錄
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    # 是否允許越出權(quán)限 
    securityContext:
      allowPrivilegeEscalation: false
kubectl create -f security.yaml
[root@node1 ~]# kubectl exec -it security-context-demo sh
/ $ id
uid=1000 gid=3000 groups=2000
/ $ ps
PID   USER     TIME  COMMAND
    1 1000      0:00 sleep 1h
    6 1000      0:00 sh
   12 1000      0:00 ps
/ $ ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ $ cd data/demo/
/data/demo $ ls -l
total 0
drwxrwsrwx    2 root     2000             6 Mar 19 03:35 .
/data/demo $ exit
[root@node1 ~]#
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庭猩,隨后出現(xiàn)的幾起案子窟她,更是在濱河造成了極大的恐慌,老刑警劉巖蔼水,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震糖,死亡現(xiàn)場離奇詭異,居然都是意外死亡趴腋,警方通過查閱死者的電腦和手機(jī)吊说,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門论咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颁井,你說我怎么就攤上這事厅贪。” “怎么了蚤蔓?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵卦溢,是天一觀的道長。 經(jīng)常有香客問我秀又,道長单寂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任吐辙,我火速辦了婚禮宣决,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昏苏。我一直安慰自己尊沸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布贤惯。 她就那樣靜靜地躺著洼专,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孵构。 梳的紋絲不亂的頭發(fā)上屁商,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音颈墅,去河邊找鬼蜡镶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恤筛,可吹牛的內(nèi)容都是我干的官还。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼毒坛,長吁一口氣:“原來是場噩夢啊……” “哼望伦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煎殷,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤屡谐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蝌数,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕掏,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年顶伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饵撑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剑梳。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滑潘,靈堂內(nèi)的尸體忽然破棺而出垢乙,到底是詐尸還是另有隱情,我是刑警寧澤语卤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布追逮,位于F島的核電站,受9級特大地震影響粹舵,放射性物質(zhì)發(fā)生泄漏钮孵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一眼滤、第九天 我趴在偏房一處隱蔽的房頂上張望巴席。 院中可真熱鬧,春花似錦诅需、人聲如沸漾唉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵刑。三九已至,卻和暖如春场刑,著一層夾襖步出監(jiān)牢的瞬間料睛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工摇邦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屎勘。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓施籍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親概漱。 傳聞我的和親對象是個(gè)殘疾皇子丑慎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友瓤摧。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì)主经,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,559評論 0 11
  • 彩排完攻人,天已黑
    劉凱書法閱讀 4,199評論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒这揣。表情可以傳達(dá)很多信息悔常。高興了當(dāng)然就笑了影斑,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,521評論 2 7