Here are a few ways, each of which operates upon the individual component associations.  In the following discussion, recall that when a key name is not a valid symbol we can write, for example, `#["col_name"]` instead of `#col`.

We can explicitly construct a new association that includes all of the old columns and adds a new one:

    ds[All, <| "col1"->"col1", "col2"->"col2", "col3"->(#col1 + #col2&) |>]
    (* col1 col2 col3
       1    2    3
       3    4    7
       5    6    11
    *)

This has the disadvantage that we have to list all of the existing columns.  To avoid this, we can use `Append`:

    ds[All, Append[#, "col3" -> #col1 + #col2]&]
    (* col1 col2 col3
       1    2    3
       3    4    7
       5    6    11
    *)

Should we wish to add multiple computed columns, we can use `Join`:

    ds[All, # ~Join~ <| "col3" -> #col1 + #col2, "col4" -> #col1 * #col2 |> &]
    (* col1 col2 col3 col4
       1    2    3    2
       3    4    7    12
       5    6    11   30
    *)

By exploiting the fact that `<| ... |>` syntax can be nested:

    <| <| "a" -> 1 |>, "b" -> 2 |>
    (* <| "a" -> 1, "b" -> 2 |> *)

... we can append columns to the dataset's associations using a shorter form:

    ds[All, <| #, "col3" -> #col1 + #col2, "col4" -> #col1*#col2 |> &]
    (* col1 col2 col3 col4
       1    2    3    2
       3    4    7    12
       5    6    11   30
    *)

_2017 Update_:  It has been observed that the shorter form is not explictly mentioned in the documentation for `Association` (as of V11.1, see comments [1][1] and [2][2] for example).  The documentation does mention that _lists_ are "flattened out":

    <| {"x" -> 1, "y" -> 2} |>
    (* <| "x" -> 1, "y" -> 2 |> *)

... and that all but the last occurrence of repeated keys are ignored:

    <| {"x" -> 1, "y" -> 1}, "y" -> 2 |>
    (* <| "x" -> 1, "y" -> 2 |> *)

The documentation also frequently says that associations can be used in place of lists in many functions.  It should come as no surprise that `Association` itself allows us to use an association in place of a list:

    <| <| "x" -> 1, "y" -> 2 |> |>
    (* <| "x" -> 1, "y" -> 2 |> *)

    <| <| "x" -> 1, "y" -> 1 |>, "y" -> 2 |>
    (* <| "x" -> 1, "y" -> 2 |> *)

This last expression is the "shorter form" from above.

Notwithstanding that the documentation strongly suggests that the short form is valid, I agree with commentators that it would be better if the documentation explicitly discussed the construction.

  [1]: https://mathematica.stackexchange.com/questions/147348/sum-all-columns-from-a-list/147400#comment401160_147400
  [2]: https://mathematica.stackexchange.com/questions/55494/changing-values-in-an-association-using-map/56000#comment407596_56000