Decorative image frame

Ubuntu Docker代理和镜像配置方法

Docker 配置镜像

1
vi /etc/docker/daemon.json

增加 “registry-mirrors”:

1
2
3
4
5
6
7
8
{
// ... 省略其他配置
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com",
"https://reg-mirror.qiniu.com"
]
}

然后重启 docker 服务:
systemctl restart docker.service

Docker 代理配置

1
2
3
4
5
6
7
$> cd /etc/systemd/system/docker.service.d # 此目录如果不存在则请手动创建
$> ls -al ./

drwxr-xr-x 2 root root 4096 Feb 28 18:22 .
drwxr-xr-x 17 root root 4096 Feb 24 15:53 ..
-rw-r--r-- 1 root root 157 Feb 28 18:21 http-proxy.conf
-rw-r--r-- 1 root root 158 Feb 28 18:22 https-proxy.conf

目录/etc/systemd/system/docker.service.d不存在的话请手动创建,并在此目录下创建两个文件:http-proxy.confhttps-proxy.conf;
http-proxy.conf增加以下内容:

1
2
[Service]
Environment="HTTP_PROXY=http://192.168.31.100:8118/" "NO_PROXY=localhost,127.0.0.1,*.edu.cn,*.docker-cn.com,*.qiniu.com"

https-proxy.conf增加以下内容:

1
2
[Service]
Environment="HTTPS_PROXY=http://192.168.31.100:8118/" "NO_PROXY=localhost,127.0.0.1,*.edu.cn,*.docker-cn.com,*.qiniu.com"

重启 Docker服务:

1
2
$> systemctl daemon-reload
$> systemctl restart docker.service

Mac 10.14.4 Beta安装Travis命令行失败解决方法

Mac 上使用 gem 安装 Travis 时报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
ERROR:  Error installing travis:
trueERROR: Failed to build gem native extension.

current directory: /usr/local/lib/ruby/gems/2.5.0/gems/ffi-1.9.23/ext/ffi_c
/usr/local/opt/ruby/bin/ruby -r ./siteconf20180305-50317-1bqw1ti.rb extconf.rb
checking for ffi.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.

Provided configuration options:
true--with-opt-dir
true--with-opt-include
true--without-opt-include=${opt-dir}/include
true--with-opt-lib
true--without-opt-lib=${opt-dir}/lib
true--with-make-prog
true--without-make-prog
true--srcdir=.
true--curdir
true--ruby=/usr/local/Cellar/ruby/2.5.0_2/bin/$(RUBY_BASE_NAME)
true--with-ffi_c-dir
true--without-ffi_c-dir
true--with-ffi_c-include
true--without-ffi_c-include=${ffi_c-dir}/include
true--with-ffi_c-lib
true--without-ffi_c-lib=${ffi_c-dir}/lib
true--with-libffi-config
true--without-libffi-config
true--with-pkg-config
true--without-pkg-config
/usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:590:in `try_cpp'
truefrom /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:1097:in `block in have_header'
from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:947:in `block in checking_for'
truefrom /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:350:in `block (2 levels) in postpone'
from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:320:in `open'
truefrom /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:350:in `block in postpone'
from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:320:in `open'
truefrom /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:346:in `postpone'
from /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:946:in `checking_for'
truefrom /usr/local/Cellar/ruby/2.5.0_2/lib/ruby/2.5.0/mkmf.rb:1096:in `have_header'
from extconf.rb:16:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

/usr/local/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-17/2.5.0/ffi-1.9.23/mkmf.log

extconf failed, exit code 1

查看日志文件/usr/local/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-17/2.5.0/ffi-1.9.23/mkmf.log发现以下问题:

1
2
3
4
5
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/include/ruby-2.0.0/ruby/ruby.h:24:10: fatal error: 'ruby/config.h' file not found
#include "ruby/config.h"
^
1 error generated.
make: *** [generator.o] Error 1

解决方法:

1
2
3
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

Gitlab-CI 集成 kubectl

环境与预备条件:

  1. gitlab 官方托管或私有的管理员账号;
  2. Kubernetes集群管理员或能使用 kubectl 操作集群权限的账号;
  3. gitlab-ci 环境要求可以执行 kubectl 命令;

步骤

1. 获取 kubeconfig

SSH 登录 k8s master 节点,使用以下命令把 /etc/kubernetes/admin.conf内容输出为 base64 格式:

1
cat /etc/kubernetes/admin.conf | base64

2. 将上面获取到的 base64 字符串保存为gitlab ci/cd 的变量;

1.1 浏览器登录到 gitlab;
1.2 进入Groups > your group > Settings > CI/CD, 然后展开右侧的 变量(Variables);
1.3 如下图所示,变量名自定义,我用的是 kube_config, 在后面的 gitlab-ci.yaml 文件中会用到,变量值填入上面获取到的 base64 字符串,然后点绿色按钮保存即可;

image.png

我们把变量kube_config设置在 Group 级别,因此,在所有归属此 Group 的项目的gitlab-ci.yml 文件中都能读取到变量kube_config, 如果只想为单个项目设置 kubectl 访问权限,可以进入项目页面的 Settings > CI/CD > Variables 设置,操作方法类似;

3. gitlab-ci.yml 设置

1
2
3
4
5
before_script:
- mkdir -p /root/.kube
- echo ${kube_config} | base64 -d > /root/.kube/config # 将 kube_config 变量转码后存入文件:/root/.kube/config
- export KUBECONFIG=/root/.kube/config # 设置 kubectl 命令的默认配置文件地址
- kubectl version # 测试是否可以访问 kube-apiserver

使用kubeadm安装k8s集群(Ubuntu Server 18.10)

系统环境:

  • 环境:KVM 虚拟机;
  • 操作系统:Ubuntu server 18.10
  • 节点:
    1. K8s-master 192.168.31.80
    2. K8s-node1 192.168.31.81
    3. K8s-node2 192.168.31.82
    4. K82-node3 192.168.31.83

准备工作:

  1. 所有节点配置 /etc/hosts, 每个节点能通过 hostname 互通(ping);
  2. 配置所有节点免密互登;
  3. 所有节点安装docker,并且为 docker 配置科学上网;
  4. 所有节点配置 apt 科学上网并安装 kubeadm kubelet, 主节点(k8smaster)还需安装kubectl;

生成证书:

生成证书是为了把允许远程访问的主节点地址加入证书,否则无法通过 kubectl 或 helm 远程管理集群.

1
2
3
4
5
6
7
8
9
10
11
12
kubeadm init phase certs all \
--apiserver-advertise-address=0.0.0.0 \
--apiserver-cert-extra-sans=\
10.96.0.1,\
192.168.31.80,\
k8s.xxxxxxxx.io,\
k8s-master,\
kubernetes,\
kubernetes.default,\
kubernetes.default.svc,\
kubernetes.default.svc.cluster.local

预拉取镜像文件

在每个节点执行以下命令:

1
kubeadm config images pull

上述命令会自动调用 docker 下载以下镜像,如果 docker 不能科学上网会失败,需要为 Docker 配置 Proxy。

k8s.gcr.io/kube-apiserver
k8s.gcr.io/kube-controller-manager
k8s.gcr.io/kube-scheduler
k8s.gcr.io/kube-proxy
k8s.gcr.io/pause
k8s.gcr.io/etcd
k8s.gcr.io/coredns

初始化主节点

1
kubeadm init --pod-network-cidr=10.244.0.0/16

参数--pod-network-cidr=10.244.0.0/16是 安装网络组件Flannel所必须的,不同的网络组件参数值不同,具体参考:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network;

执行上述命令后发生了什么?

  1. 自动调用上一节所述的命令 kubeadm config images pull 拉取镜像文件;
  2. 逐一使用这些镜像启动容器;
  3. 会输出一个让节点加入集群的命令(以下命令不能直接复制执行,因为每次执行kubeadm init 所生成的 token 是不一样的,请直接从您执行 kubeadm init 命令后的输出结果里复制),这个命令后续会用到,请记下来:
1
2
kubeadm join 192.168.31.80:6443 --token  xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

其中 token 默认有效期为24小时, 如果过期重新生成新的 token 请使用此命令:

1
2
3
4
5
6
7
$ kubeadm token create

-- output: --------------------------------

TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
xxxxxx.xxxxxxxxxxxxxxxx 22h 2018-12-17T14:58:01+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token

查看可用的 Token: kubeadm token list;

获取ca证书sha256编码hash值:

1
2
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

执行完毕后使用此命令检查k8s-master 状态:

1
kubectl get pods --kube-system -o wide

输出结果:

1
2
3
4
5
6
7
8
9
NAMESPACE     NAME                                 READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
kube-system coredns-86c58d9df4-tfghj 0/1 Pending 0 79s 10.244.0.79 k8s-master <none> <none>
kube-system coredns-86c58d9df4-tfqjm 0/1 Pending 0 79s 10.244.0.78 k8s-master <none> <none>
kube-system etcd-k8s-master 1/1 Running 0 24s 192.168.31.80 k8s-master <none> <none>
kube-system kube-apiserver-k8s-master 1/1 Running 0 33s 192.168.31.80 k8s-master <none> <none>
kube-system kube-controller-manager-k8s-master 1/1 Running 0 18s 192.168.31.80 k8s-master <none> <none>
kube-system kube-proxy-4jqjk 1/1 Running 0 79s 192.168.31.80 k8s-master <none> <none>
kube-system kube-scheduler-k8s-master 1/1 Running 0 19s 192.168.31.80 k8s-master <none> <none>

其中前面两个 pod 一直处于 Pending 状态,这是因为还没有为集群安装网络组件,等下一步安装完 Flannel 组件后就会变成 Running 状态;

安装网络组件 Flannel

在主节点执行以下命令:

1
2
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml

执行完毕后会自动启动一个名为kube-flannel-ds-amd64-xxxxx的 pod,并且 coredns-xxxxxxxxx-xxxxx 状态会变成 Running 状态。

至此,k8s-master 节点配置完毕,接下来 将另外三个node节点加入集群:

分别在另外三个节点(k8s-node1, k8s-node2, k8s-node3)上执行以下命令:

1
2
kubeadm join 192.168.31.80:6443 --token  xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

执行完毕后,在 k8s-master 节点上使用以下命令就能看到节点状态:

1
2
3
4
5
6
7
8
9
kubectl get nodes

---output: ------------------------------------------

NAME STATUS ROLES AGE VERSION
k8s-master Ready master 118m v1.13.1
k8s-node1 Ready <none> 77s v1.13.1
k8s-node2 Ready <none> 43s v1.13.1

Webpack使用Zepto引用jQuery插件

因为Zepto体积小,有很多移动端项目使用Zepto代替了jQuery, 最近使用Webpack打包一个Web项目,项目使用了Zepto,同时有引用了jQuery插件,部分jQuery插件内部使用了AMD的require('jquery')写法引入jQuery,一般情况下这样没有问题,但是Webpack打包时就会出现无法找到jquery模块的错误:

1
Module not found: Error: Cannot resolve module 'jquery' in /Users/colin/Projects/xxx/xxx.js

因为已经使用了Zepto,肯定不能另外再使用jQuery,所以必须告诉Webpack如何找到jquery模块,因为Zepto的API与jQuery的API基本一致,理论上只要把jquery软链接到zepto就行了,那么问题来了,Webpack如何做这个软链接呢?

  1. 使用resolve.alias

Webpack提供了alias配置,可以直接把jquery链接到Zepto库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// webpack.config.js
{
entry: {
main: "./main"
},
output: {
filename: "[name].[chunkhash:8].js"
},
resolve: {
alias: {
jquery: 'path/to/zepto.js' // 把jquery指向Zepto.js
}
}
}
  1. 使用expose-loaderexternals

externals的目的是让Webpack直接从全局变量中读取对应的组件,这里我们要读取的是Zepto,但是Webpack默认不会把Zepto暴露为全局变量,即不能通过window.Zepto访问到Zepto,所以首先要把Zepto暴露为全局组件,然后通过webpack的配置项externalsjquery指向window.Zepto全局变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// webpack.config.js
{
entry: {
main: "./main"
},
output: {
filename: "[name].[chunkhash:8].js"
},
module: {
loaders: [
// 暴露zepto为全局变量:Zepto
{test: require.resolve("zepto"), loader: "expose-loader?Zepto" }
]
},
externals: {
// 将jquery指向window.Zepto全局变量
jquery: 'window.Zepto', // Usage: var $ = require('jquery');
}
}

jquery.jstree选中或取消选中节点

jQuery.jstree组件有个checkbox的plugin,支持在treeview的每个节点前显示一个checkbox,对于后台管理系统UI和交互这是个非常有价值的功能,但是官方除了一个简单的实例却没有详细的文档说明,让很多开发者饶了不少弯,下面是我使用时发现的一些常用方法。

###. 官方的checkbox Demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div id="jstreeContainer"></div>
<script>
jQuery(function($) {

$("#jstreeContainer").jstree({
"core": {
'data': [
{"id": "id1", "parent": "#", "text": "Root node", "state": {
"opened": true,
"selected": true
}},
{"id": "id2", "parent": "#", "text": "Root node 2" },
{"id": "id3", "parent": "id2", "text": "Child 1" },
{"id": "id4", "parent": "id2", "text": "Child 2" },
]
},
"checkbox": {
"keep_selected_style": true
},
"plugins": [ "checkbox" ]
});

});
</script>

默认选中jstree的指定节点:

1
2
3
4
5
// 选中单个节点
$("#jstreeContainer").jstree('check_node', 'id1');

// 批量选中节点
$("#jstreeContainer").jstree('check_node', ['id1', 'id2', 'id4']);

取消选中jstree的指定节点:

1
2
3
4
5
// 取消选中单个节点
$("#jstreeContainer").jstree('uncheck_node', 'id1');

// 批量取消选中节点
$("#jstreeContainer").jstree('uncheck_node', ['id1', 'id2', 'id4']);

选中jstree的所有节点:

1
$("#jstreeContainer").jstree('check_all');

取消选中jstree的所有节点:

1
$("#jstreeContainer").jstree('uncheck_all');

获取被选中的节点:

1
2
var checkedNode = $("#jstreeContainer").jstree('get_checked');
console.log(checkedNode);

我看到网上很多开发者在问一些如何默认选中节点的问题,没有看到一个完全可用的答案,比如如何选中checkbox,甚至有人回答说通过JS给节点增加css classname: node_checked,这个完全是治标不治本的做法,其实根本没有选中想要的节点,只是改变了tree node上的Checkbox的外观,当你调用$("#jstreeContainer").jstree("get_checked")获取已选中节点时,就会发现获取到的结果永远是一个空数组,jstree获取被选中节点的原理是读取JSON数据this._data.checkbox.selected中的节点,而不是判断节点的css classname有没有被选中。

川西自驾游(5)——稻城亚丁

上一篇: 川西自驾游(4)——新都桥至稻城
下一篇: 川西自驾游(6)——稻城返回上海

相关文章:

  1. 川西自驾游(1)——上海至成都
  2. 川西自驾游(2)——成都至摩西镇(海螺沟冰川森林公园)
  3. 川西自驾游(3)——摩西镇至新都桥
  4. 川西自驾游(4)——新都桥至稻城(多图,沿途风景绝美)
  5. 川西自驾游(5)——稻城亚丁景区(多图,风景美到想哭)
  6. 川西自驾游(6)——稻城返回上海,沿途拍了不少小视频

川西自驾游(6)——稻城至上海

早上天微亮就从位于稻城县香格里拉镇上的锦江亚丁宾馆出发,沿途的风景依然美得令人想流泪,但是为了赶路,路上没有再停留,在高原上一路纵情驰骋,稻城至理塘路况太好,限速60有的路段开120km/h都没问题,当然保证安全是前提。

一路狂飙,下午3点多就到康定了,理论上可以直接开到成都,还是决定在康定住一晚。 回到上海,里程碑显示6087公里(在上海出发时已经清零了)

下一篇: 川西自驾游(5)——稻城亚丁

相关文章:

  1. 川西自驾游(1)——上海至成都
  2. 川西自驾游(2)——成都至摩西镇(海螺沟冰川森林公园)
  3. 川西自驾游(3)——摩西镇至新都桥
  4. 川西自驾游(4)——新都桥至稻城(多图,沿途风景绝美)
  5. 川西自驾游(5)——稻城亚丁景区(多图,风景美到想哭)
  6. 川西自驾游(6)——稻城返回上海,沿途拍了不少小视频

川西自驾游(4)——新都桥至稻城

著名的G318天路十八弯

通过高尔寺山隧道后,往雅江方向全都是下坡,道路沿着山谷螺旋形下降

翻越卡子拉山

在卡子拉山附近遇到了之前我在朋友圈说的强卖酸奶事件,以后大家如果经过卡子拉山时一定要注意观察,如果发现藏族人多的观景台千万别停车,只要一停下来,就会有人过来强行要求你买酸奶,如果窗户关起来了,有的人还会抓门把手开门,只要被他们缠上了不买是绝对不好走的,在被强行买了一杯50块的酸奶后,后面好几个观景台都看到一伙一伙的藏民扒着刚停下来的车强卖酸奶,他们就扒在车窗上,要是强行开车走人把他们拖倒在地估计麻烦就大了。

翻越卡子拉山后就到了高原明珠:理塘县,到理塘后转S217省道往稻城方向,经过停车费和强卖酸奶事件后,沿途谨慎了不少,想起在海螺沟听到隔壁桌讲的那些碰瓷、拦路抢劫、敲诈等藏民的行为,开始有点担忧了,我们就我跟我老婆单车,要是遇上敲诈勒索的真没法跟人斗,路上只要看到不是当地牌照的车就一直跟着走,至少看到同行的车多不会被人盯上。

理塘往稻城方向的风景绝对是我们出发以来最美的,高原、胡杨树、牛羊成群、石河公园、古冰川遗址,应接不暇;

上一篇:川西自驾游(3)——摩西镇至新都桥
下一篇:川西自驾游(5)——稻城亚丁景区

相关文章:

  1. 川西自驾游(1)——上海至成都
  2. 川西自驾游(2)——成都至摩西镇(海螺沟冰川森林公园)
  3. 川西自驾游(3)——摩西镇至新都桥
  4. 川西自驾游(4)——新都桥至稻城(多图,沿途风景绝美)
  5. 川西自驾游(5)——稻城亚丁景区(多图,风景美到想哭)
  6. 川西自驾游(6)——稻城返回上海,沿途拍了不少小视频

川西自驾游(3)——摩西镇至新都桥

从摩西镇出发 快到泸定了
一路上遇到的川藏线运输车队,绵延几公里,每一辆车都有编号,一辆接一辆 经过康定市区 经过康定市区

在康定市区忘记加油了,过了大概10公里才发现邮箱只剩下1/3,查地图前面都没有加油站,后面路边问到一个师傅说要翻越折多山后到新都桥才有加油站,大约还有70公里,估算了一下,跑到新都桥没有问题,于是继续赶路;

经过康定后,准备翻越折多山的路上,都是上坡,雾越来越大 跟着这个大货车跑了很远,雾大,根本不敢超车 雾大,大家都开着双跳灯,川藏线上最壮观的除了风景,还有大货车带小车巡逻,大货车爬坡慢,后面都是跟着一队队长长的小车队,好不容易才超过去一辆,弯多、陡坡、雾大、对向车道拥挤,根本就没法超车 终于到达折多山顶,浓雾笼罩了一切,阳光被模糊成了这样

在折多山顶停车时,居然有人过来收停车费,我刚停车一个僧人模样打扮的藏族人就过来收费,我以为这里是正常收费的,就给了5块钱,下来拍照时发现那个收费的人居然上了一辆路虎开车走了,里面好几个同样装扮的人,才知道被骗了,虽然只有5块钱,但是这种被骗的感觉也挺不爽的;

翻越折多山后,下山途中,天色渐晚 太阳已经下山了 太阳已经下山了 太阳已经下山了

翻越折多山后就到了被誉为摄影家天堂的新都桥,但是已经天黑,除了路面,什么都看不见,于是沿途边走边找住宿,后面看到一家客栈门前停了好几辆湖北牌照的越野车,就停车看看,一个藏族小伙子马上热情的过来询问是否需要住宿,他们这里50块钱一个床位,并说可以先看看房间,满意就住;

我停好车,藏族小伙子看我们是湖南车牌,跟我们说这个客栈以前的老板就是湖南的,后面转让给他们了,边说边带我们上楼,客栈的装修是典型的藏族风格,今晚有7、8个湖北车友住这里,还有一个从江苏出发准备去西藏阿里的自驾游客,他们吃完饭在看电视,和他们聊了几句,老板查看了二楼的所有房间,都满了,又带我们到一楼看,后面觉得还可以,就决定在这里住下了,天黑了也不好继续找其他的住宿;

老板给我们安排一个两个床位的单独房间,其他的房间都是一个房间很多床位,上午海螺沟走累了,感觉腿酸,而且这里大约海拔3200米,感觉稍微有点呼吸不畅,随便吃了点东西就洗漱睡觉了

半夜被老婆的尖叫声惊醒,以为出什么事了,原来是只小老鼠从她脸上爬过,被吓得不行,于是起来赶老鼠,办法想尽了都没把小家伙赶出去,后面干脆把门打开,看能不能它自己跑出去,后面不知不觉又睡着了,大概睡了一小时醒来没发现动静了,估计小老鼠是已经出去了,这才把门关起来安心的睡着;

第五天

早上起来洗漱好,藏族老板娘已经给我们准备了早餐:酥油茶、糌粑、奶酪 酥油茶和糌粑挺好吃的,但是奶酪的味道实在吃不习惯,我和老婆两人都觉得吃到嘴里就想吐,我喝了两大碗酥油茶和几个糌粑,老板娘又过来给我们把酥油茶满上并问我们味道可以吗?我说酥油茶和糌粑非常美味,但是奶酪有点吃不习惯,吃完早餐后我去拿保温瓶装开水,老婆和老板娘聊了一会天,说她们这里的风俗习惯都是女主人干活,放羊、做农活等等,男主人平时都只顾着玩 准备从客栈出发,客栈名字叫“在路上” 倒车出来才发现,客栈以前就叫“在路上湘菜馆”,昨晚天黑了居然没看见招牌,挺巧

上一篇:Post not found: 川西自驾游(2)成都至摩西镇 川西自驾游(2)成都至摩西镇
下一篇:川西自驾游(4)——新都桥至稻城

相关文章:

  1. 川西自驾游(1)——上海至成都
  2. 川西自驾游(2)——成都至摩西镇(海螺沟冰川森林公园)
  3. 川西自驾游(3)——摩西镇至新都桥
  4. 川西自驾游(4)——新都桥至稻城(多图,沿途风景绝美)
  5. 川西自驾游(5)——稻城亚丁景区(多图,风景美到想哭)
  6. 川西自驾游(6)——稻城返回上海,沿途拍了不少小视频